bzoj 1661: [Usaco2006 Nov]Big Square 巨大正方形(枚举)

来源:互联网 发布:云建站淘宝客 编辑:程序博客网 时间:2024/06/07 11:56

1661: [Usaco2006 Nov]Big Square 巨大正方形

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 467  Solved: 230
[Submit][Status][Discuss]

Description

农民 John 的牛参加了一次和农民 Bob 的牛的竞赛。他们在区域中画了一个N*N 的正方形点阵,两个农场的牛各自占据了一些点。当然不能有两头牛处于同一个点。农场的目标是用自己的牛作为4个顶点,形成一个面积最大的正方形(不必须和边界平行) 。 除了 Bessie 以外,FJ其他的牛都已经放到点阵中去了,要确定bessie放在哪个位置,能使得农民约翰的农场得到一个最大的正方形(Bessie不是必须参与作为正方形的四个顶点之一)。

Input

* Line 1: 一个整数 N,2<=N<=100

* Lines 2..N+1: 第 i+1 行描述点阵的第i行,有 N 个字符。字符集是: 'J' 表示这个点是农民 John 的牛, 'B'表示这个点是农民 Bob 的牛, '*' 表示这个点没有被占据。保证至少有一个点没有被占据。

Output

* Line 1: 最大正方形的面积,或者无解的话输出0。

Sample Input

6
J*J***
******
J***J*
******
**B***
******

Sample Output

4


一个正方形只要满足三个顶点是J,第四个顶点不是B就符合要求

所以可以暴力枚举相邻的两个J,然后判断另外两个点是否满足条件就好了

#include<stdio.h>#include<math.h>#include<algorithm>using namespace std;typedef struct{int x;int y;}Point;Point s[10005], a, b;char str[105][105];int main(void){int n, i, j, ans, cnt = 0;scanf("%d", &n);for(i=1;i<=n;i++){scanf("%s", str[i]+1);for(j=1;j<=n;j++){if(str[i][j]=='J')s[++cnt].x = i, s[cnt].y = j;}}ans = 0;for(i=1;i<=cnt;i++){for(j=i+1;j<=cnt;j++){a.y = s[i].y+(s[j].x-s[i].x);a.x = s[i].x+(s[i].y-s[j].y);b.y = s[j].y+(s[j].x-s[i].x);b.x = s[j].x+(s[i].y-s[j].y);if(a.x<1 || a.x>n || a.y<1 || a.y>n || b.x<1 || b.x>n || b.y<1 || b.y>n)continue;if(str[a.x][a.y]=='J' && str[b.x][b.y]!='B' || str[a.x][a.y]!='B' && str[b.x][b.y]=='J')ans = max(ans, (s[i].x-s[j].x)*(s[i].x-s[j].x)+(s[i].y-s[j].y)*(s[i].y-s[j].y));}}for(i=1;i<=cnt;i++){for(j=i+1;j<=cnt;j++){a.y = s[i].y-(s[j].x-s[i].x);a.x = s[i].x-(s[i].y-s[j].y);b.y = s[j].y-(s[j].x-s[i].x);b.x = s[j].x-(s[i].y-s[j].y);if(a.x<1 || a.x>n || a.y<1 || a.y>n || b.x<1 || b.x>n || b.y<1 || b.y>n)continue;if(str[a.x][a.y]=='J' && str[b.x][b.y]!='B' || str[a.x][a.y]!='B' && str[b.x][b.y]=='J')ans = max(ans, (s[i].x-s[j].x)*(s[i].x-s[j].x)+(s[i].y-s[j].y)*(s[i].y-s[j].y));}}printf("%d\n", ans);return 0;}/*6J***********J******************************/

阅读全文
1 0
原创粉丝点击