SHUOJ农场的边长

来源:互联网 发布:stc单片机最小系统 编辑:程序博客网 时间:2024/04/30 07:57

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

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;}