#include<iostream> #include<vector> usingnamespace std; intmin(int x, int y) { if (x <= y)return x; elsereturn y; } intmain() { int n, m; cin >> n >> m; //原数组 vector<vector<int>> ori(n+1, vector<int>(m+1,0)); //前缀和数组 vector<vector<int>> sum(n+1, vector<int>(m+1,0)); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { //输入原数组 cin >> ori[i][j]; //求前缀和数组 sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + ori[i][j]; } } int ans = 1;//记录最大边长,从1开始,因为题目保证至少有1个1 int a = 2;//边长从2开始变大,如果2都不行,ans就是1 while (a <= min(n, m)) { //坐标i,j从(1,1)开始,到边界截止,逐个遍历所有可能的正方形,用前缀和数组计算正方形的矩阵和, //如果矩阵和与面积相等,则说明没有0全是1,则ans更新为当前的a for (int i = 1; i <= n - a + 1; i++) { for (int j = 1; j <= m - a + 1; j++) { if ((sum[i + a - 1][j + a - 1] - sum[i - 1][j + a - 1] - sum[i + a - 1][j - 1] + sum[i - 1][j - 1]) == a * a) { ans = a; } } } a++; } cout << ans << endl; }