洛谷 P1387 最大正方形 C语言
题目描述
在一个 n × m 的只包含 0 和 1 的矩阵里找出一个不包含 0 的最大正方形,输出边长。
输入格式
输入文件第一行为两个整数 n, m (1 ≤ n, m ≤ 100),接下来 n 行,每行 m 个数字,用空格隔开,0 或 1。
输出格式
一个整数,最大正方形的边长。
输入输出样例
输入 #1
4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1
输出 #1
2
思路:
代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
typedef long long ll;
const int N = 1010;
int n, m;
int arr[N][N];
ll pre[N][N]; // 使用 long long 类型以避免大数溢出
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
cin >> arr[i][j];
pre[i][j] = pre[i-1][j] + pre[i][j-1] - pre[i-1][j-1] + arr[i][j];
}
}
int ans = 0;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
for (int l = 1; l <= min(n - i + 1, m - j + 1); l++)// 确保不越界
{
if (pre[i+l-1][j+l-1] - pre[i-1][j+l-1] - pre[i+l-1][j-1] + pre[i-1][j-1] == l * l)
{
ans = max(ans, l);
}
else
{
break; // 如果当前边长不满足,则无需继续检查更大的边长
}
}
}
}
cout << ans << endl;
return 0;
}