您的位置:首页 > 其它

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

2017-09-14 12:59 429 查看

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;
}
/*
6
J*****
******
J*****
******
******
******
******
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: