POJ3251:Big Square 题解

来源:互联网 发布:姚明 小球知乎 编辑:程序博客网 时间:2024/05/29 14:09

转载请注明出处:http://blog.csdn.net/RavenChau/article/details/78023318

【原题】

Big Square
Time Limit: 2000MS Memory Limit: 65536KTotal Submissions: 4882 Accepted: 1000

Description

Farmer John's cows have entered into a competition with Farmer Bob's cows. They have drawn lines on the field so it is a square grid withN ×N points (2 ≤ N ≤ 100), and each cow of the two herds has positioned herself exactly on a gridpoint. Of course, no two cows can stand in the same gridpoint. The goal of each herd is to form the largest square (not necessarily parallel to the gridlines) whose corners are formed by cows from that herd.

All the cows have been placed except for Farmer John's cow Bessie. Determine the area of the largest square that Farmer John's cows can form once Bessie is placed on the field (the largest square might not necessarily contain Bessie).

Input

Line 1: A single integer, N
Lines 2..N+1: Line i+1 describes line i of the field withN characters. The characters are: 'J' for a Farmer John cow, 'B' for a Farmer Bob cow, and '*' for an unoccupied square. There will always be at least one unoccupied gridpoint.

Output

Line 1: The area of the largest square that Farmer John's cows can form, or 0 if they cannot form any square.

Sample Input

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

Sample Output

4

Source

USACO 2006 November Silver
【题意】
图中点J可围成正方形的最大面积(可多加一点J,但不能覆盖点B)
【思路】
两两J点连线,判断能否成为正方形的邻边,之后取最大值
【AC代码】
#include <cstdio>#include <cstring>int map[110][110];int main() {    int n;    scanf("%d", &n);    memset(map, 0, sizeof(map));    char ano;    scanf("%c", &ano);    for(int i = 1; i <= n; i ++) {        for(int j = 1; j <= n; j ++) {            char c;            scanf("%c", &c);            if(c == 'J')                map[i][j] = 1;            else if(c == 'B')                map[i][j] = -1;        }        char ano;        scanf("%c", &ano);    }    int area = 0,ans = 0;    for(int i = 1; i <= n; i ++) {        for(int j = 1; j <= n; j ++) {            if(map[i][j] == 1) {                for(int x = i; x <= n; x ++) {                    for(int y = 1; y <= n; y ++) {                        if(map[x][y] == 1) {                            area = (x - i) * (x - i) + (y - j) * (y - j);                            if(area <= ans) continue;                            if((i+j-y)>0&&(j+x-i)>0&&(x+j-y)>0&&(y+x-i)>0&&(i+j-y)<=n&&(j+x-i)<=n&&(x+j-y)<=n&&(y+x-i)<=n&&(map[i+j-y][j+x-i]+map[x+j-y][y+x-i]>0) ||                               (i-j+y)>0&&(j-x+i)>0&&(x-j+y)>0&&(y-x+i)>0&&(i-j+y)<=n&&(j-x+i)<=n&&(x-j+y)<=n&&(y-x+i)<=n&&(map[i-j+y][j-x+i]+map[x-j+y][y-x+i]>0) ) {                                   ans = area;                            }                        }                    }                }            }        }    }    printf("%d\n", ans);    return 0;}

原创粉丝点击