题目描述
在一个 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。
输出格式
一个整数,最大正方形的边长。
样例 #1
样例输入 #1
4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1
样例输出 #1
2
代码如下:
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> matrix(n, vector<int>(m)); // 初始化二维数组
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> matrix[i][j];
}
}
// dp[i][j]表示以matrix[i][j]为右下角的正方形的最大边长
vector<vector<int>> dp(n, vector<int>(m, 0));
int maxLen = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (i == 0 || j == 0 || matrix[i][j] == 0) { // 边界条件,如果是第一行或者第一列,或者matrix[i][j] == 0,说明以当前位置为右下角不可能构成正方形
dp[i][j] = matrix[i][j];
}
else {
// 以matrix[i][j]为右下角的正方形的最大边长取决于左边、上边、左上边的正方形的最大边长,
// 为什么取最小值,因为只有三个边都是1,才能构成一个正方形
dp[i][j] = min(dp[i - 1][j - 1], min(dp[i][j - 1], dp[i - 1][j])) + 1;
}
maxLen = max(maxLen, dp[i][j]); // 更新最大边长
}
}
cout << maxLen << endl;
return 0;
}