SHUOJ农场的边长
描述
飞哥最近 得到 了一大块 n*m 的土地 ,他想在这块土地 上建一个正方 形的农场 ,但是 这块土 地有些地方 被大石头 占着,无法 使用 ,于是 飞哥想来问你 在这块土地 上能建成的农场 的最大 边 长为多少 ?
输入
第一个数T表示数组组数
每组 数据 一开 始有两个 整数 n和 m,表示 土地 的长和宽。
接下 来是个 n*m 的矩阵元素只有0和1,0表示 这块地方被石头占着,1表示可以使用。
m,n<=1000
输出
对每组数据输出一行,表示农场最大的边长。
样例输入
4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1
样例输出
2
我的想法
这是在矩阵里找一个最大的正方形,相关的博客有很多。然而对于咸鱼的我来说还是太难理解了,有些很棒的代码没有思路和注释,对我来说又是一个巨大的挑战(可能我只能展望试读警告了吧orz)。跪求大佬能指点一下我。当然看过感觉有用的资料还是要贴出来
[LeetCode01矩阵]http://blog.csdn.net/jiyanfeng1/article/details/47269465
2018.8.17更新
回过头来再看一遍,还是蛮好理解的,虽然要我自己想怕是写不出来
AC代码
#include<stdio.h>
int matrix[1000][1000];
int main()
{
int t=0,i=0;
scanf("%d",&t);
for(i=0;i<t;i++)
{
int n,m,j,k;
scanf("%d %d",&n,&m);
for(j=0;j<n;j++)
for(k=0;k<m;k++)
scanf("%d",&matrix[j][k]);
k=large(n,m);
}
return 0;
}
int large(int n,int m)
{
int max=1;
int i,j;
for(i = 1; i < n; i++)
for(j = 1; j < m; j++)
if(matrix[i][j] == 1) //从右下角往回判断
{
int mmin = min(matrix[i - 1][j], matrix[i][j - 1]);
mmin = min(matrix[i - 1][j - 1], mmin);
matrix[i][j] = mmin + 1;
if(max < matrix[i][j])
max = matrix[i][j];
}
printf("%d\n",max);
return max;
}
int min(int a,int b)
{
return a < b ? a : b;
}