在一个A*B的矩阵中,只包含0和1,从矩阵中找出边长最大的全1子矩阵。
输入行数和列数
输出最大边长。
#include <iostream>
using namespace std;
int x[400][400] = {0};
int upperbound[400][400] = {0};
int a(0),b = 0,temp(0);
//更新为,本行中,x[i][j]的前面连续的1的个数+1;
void pre()
{
for (int i = 0;i<a;i++)
{
for (int j = 1;j<b;j++)
{
if (x[i][j] == 1&&x[i][j-1] !=0)
{
x[i][j] = x[i][j-1] +1;
}
}
}
}
//上下检索,大于本身,则cnt+1
int serach_up_down(int row,int col)
{
int cnt = 1,val = x[row][col];
for (int i = row-1;i>=0;i--)
{
if (x[i][col] >=val)
{
cnt++;
}
else
{
break;
}
}
for (int i = row+1;i<a;i++)
{
if (x[i][col]>=val)
{
cnt++;
}
else
{
break;
}
}
if (val>cnt)
{
return cnt;
}
else
{
return val;
}
}
//循环遍历找出
int getMax()
{
int length = 0;
for (int i = 0 ;i<a;i++)
{
for (int j = 0;j<b;j++)
{
if (x[i][j] != 0)
{
int val = serach_up_down(i,j);
if (val>length)
{
length = val;
}
}
}
}
return length;
}
int main()
{
cout<<"请输入行数和列数"<<endl;
cin>>a>>b;
for (int i = 0;i<a;i++)
{
for (int j = 0;j<b;j++)
{
cin>>temp;
x[i][j] = temp;
}
}
pre(); //预处理
cout<<getMax()<<endl;
}