单位矩阵

浪尽此生 提交于 2020-01-16 02:34:31

单位矩阵

题目描述
X是一个灰常讨厌数学的学生,所以想请你帮他解决一个简单的关于矩阵的问题。给定一个只有0和1构成的大小为M*N的矩阵,在其中找到最大的子单位矩阵。单位矩阵是指主对角线上元素全部为1,其余元素全部为0的方阵。主对角线是指左上角到右下角方向的对角线。数据规模(1<=M,N<=1000)。
输入格式
多组数据输入,每组第一行输入M和N,空格分开,接下来M行输入矩阵数据,每行N个元素,输入以文件尾(EOF)结束。
输出格式
对于每组数据,输出该矩阵中最大子单位矩阵的行数,每次输出独占一行。
输入样例 复制
5 6
010000
010001
010000
001000
100111
2 5
01000
00110
输出样例 复制
3
2

会花思路代码段:
#include<iostream>
#include"stdio.h"
#include<cstring>
using namespace std;
int a[1005][1005]={0};
int f[1005][1005]={0};
int main()
{
	int n,m;
	char c;
	while(scanf("%d %d",&n,&m)!=EOF){
	int maxx=0;
	int z[1005]={0},s[1005]={0};
	memset(a,0,sizeof(a));
	memset(f,0,sizeof(f));
	//getchar();
	for(int i=1;i<=n;i++)
	{
		getchar();
		for(int j=1;j<=m;j++)
		{
          scanf("%c",&c);
          a[i][j]=c-'0';
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
          if(a[i][j]==1)
          {
              f[i][j]=min(f[i-1][j-1],min(z[j],s[i]))+1;
              z[j]=0;
              s[i]=0;
          }
          else if(a[i][j]==0)
          {
              f[i][j]=0;
              z[j]++;
              s[i]++;
          }
          //printf("i=%d,j=%d,f=%d,s=%d,z=%d\n",i,j,f[i][j],s[i],z[j]);
          maxx=max(f[i][j],maxx);
		}
	}
	printf("%d\n",maxx);

	}
	return 0;
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!