题目描述
在一个 n * m 的只包含 0 和 1 的矩阵里找出一个不包含 0 的最大正方形,输出边长。
输入描述
输入文件第一行为两个整数 n , m( 1 <= n , m <= 100 ),接下来 n 行,每行 m 个数字,用空格隔开,0 或 1 .
输出描述
一个整数,最大正方形的边长。
输入样例
4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1
输出样例
2
由于本题为 0、1 矩阵,因此可以考虑用前缀和的方法来做。若某区域内的数字之和恰好等于该区域的面积大小,则说明该区域内的数字皆为 1 ,满足题目要求。因此可以令边长从 1 开始循环直到该矩阵的宽度,当查找到该边长的正方形符合题意时,则更新答案。
参考代码
#include <algorithm>
#include <iostream>
using namespace std;
int a[103][103];
int b[103][103];
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
b[i][j] = b[i][j - 1] + b[i - 1][j] - b[i - 1][j - 1] + a[i][j];
}
int ans = 1;
int l = 2;
while (l <= min(n, m)) {
for (int i = l; i <= n; i++)
for (int j = l; j <= m; j++)
if (b[i][j] - b[i - l][j] - b[i][j - l] + b[i - l][j - l] == l * l)
ans = max(ans, l);
l++;
}
cout << ans << endl;
return 0;
}