单位矩阵
题目描述
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;
}
来源:CSDN
作者:佐雪
链接:https://blog.csdn.net/qq_43753372/article/details/103991053