建别墅
Time Limit:10000MS Memory Limit:65536K
Case Time Limit:1000MS
Description
何老板买了一块面积为n*m的土地,他想在这块土地上建造一座别墅。按照中国传统四平八稳的思想,他希望这个别墅是正方形的。
但是,这块土地并非十全十美,上面有很多地方是不平坦的,以至于根本不能在上面盖一砖一瓦。
他希望找到一块最大的平坦的正方形土地来盖别墅。应该选哪一块土地呢?现在,你来告诉他吧。
Input
第一行为两个整数n,m(1<=n,m<=1000),接下来n行,每行m个数字,用空格隔开。0表示该块土地不平坦,1表示该块土地平坦。
Output
一个整数,最大正方形的边长。
Sample Input
4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1
Sample Output
2
#include <stdio.h> bool a[1001][1001]; int f[1001][1001]; int min(int a, int b, int c) { if(a>b) a=b; if(a>c) a=c; return a; } inline void _read(int& d) { char t=getchar();bool f=false; while(t<'0'||t>'9') {if(t=='-') f=true; t=getchar();} for(d=0;t<='9'&&t>='0';t=getchar()) d=d*10+t-'0'; if(f) d=-d; } inline void _out(int d) { int o[30],top=1; if(d==0){putchar('0');return ;} if(d<0) {putchar('-');d=-d;} while(d) { o[top++]=d%10; d/=10; } for(--top;top;--top) putchar('0'+o[top]); } int main() { int i, j, n, m, t, ans=0; _read(n), _read(m); for(i=1; i<=n; i++) { for(j=1; j<=m; j++) { _read(t); if(t) { a[i][j]=1; f[i][j]=1+min(f[i][j-1], f[i-1][j], f[i-1][j-1]); if(ans<f[i][j]) ans=f[i][j]; } } } _out(ans); return 0; }