在一个 n × m n\times m n×m 的只包含 0 0 0 和 1 1 1 的矩阵里找出一个不包含 0 0 0 的最大正方形,输出边长。
输入文件第一行为两个整数 n , m ( 1 ≤ n , m ≤ 100 ) n,m(1\leq n,m\leq 100) n,m(1≤n,m≤100),接下来 n n n 行,每行 m m m 个数字,用空格隔开, 0 0 0 或 1 1 1。
一个整数,最大正方形的边长。
4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1
2
#include
using namespace std;
#define sf(x) scanf("%d",&x);
#define de(x) cout<<x<<" ";
#define Pu puts("");
typedef long long ll;
const int N=1e2+10;
int a[N][N];
int pre[N][N];
int n,m,ans;
int fun(int t){
int l,r,u;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
l=i+t-1;r=j+t-1;
if(l>n||r>m||i-1<0||j-1<0) continue;
u=pre[l][r]-pre[i-1][r]-pre[l][j-1]+pre[i-1][j-1];
if(u==t*t) return 1;
}
}
return 0;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
sf(a[i][j])
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+a[i][j];
}
}
for(int i=100;i>=1;i--){
if(fun(i)){
ans=i;
break;
}
}
de(ans)
return 0;
}