题目
众所周知,ccm不仅擅长数据结构,还擅长带妹吃鸡。某日,ccm与yblin四排带妹,yblin提出了十分优秀的战略部署:平原跳伞、分散打钱。于是,,,他们队伍里就只剩ccm了。为了带妹纸躺赢,ccm召唤了卢来佛祖,提前得知了决赛圈的位置。经过观察,ccm发现决赛圈是一个n*m的矩形(别跟我说是圆,我ccm没有开挂),外圈都是平地,其中有若干个草丛。ccm想要知道最大的浓密草丛的面积是多大(所谓浓密草丛指的是一片没有和平地在上下左右四个方向上相连的草丛,两片草丛相邻的定义是它们在上下左右四个方向上相邻)。这个问题对于ccm来说很简单,可惜这次召唤卢来佛祖消耗了ccm太多体力,所以请你来帮帮他!
输入格式:
第一行是两个整数n,m(1<=n,m<=1000)表示矩阵的大小。 接下来n行,每行有m个字符,’.’表示这个地方是平地,’#’表示这个地方是草丛。
输出格式:
一个数字,最大的浓密草丛的面积。
输入样例1:
在这里给出一组输入。例如:
4 5
…
.##…
.##…
…
输出样例1:
0
输入样例2:
在这里给出一组输入。例如:
6 6
…
.####.
.####.
.####.
.####.
…
输出样例2:
4
代码
#include <iostream>
using namespace std;
int N,M;
int num;
char a[1005][1005];
int b[1005][1005]={0};
bool judge(int n,int m)
{
if(a[n][m]=='.')
return false;
if(a[n-1][m]=='.')
return false;
if(a[n+1][m]=='.')
return false;
if(a[n][m-1]=='.')
return false;
if(a[n][m+1]=='.')
return false;
return true;
}
void func(int i,int j)
{
if(b[i][j])
{
//自身
b[i][j]=0;
num++;
//上
func(i-1,j);
//下
func(i+1,j);
//左
func(i,j-1);
//右
func(i,j+1);
}
else
return;
}
int main()
{
cin>>N>>M;
for(int i=0;i<N;i++)
for(int j=0;j<M;j++)
cin>>a[i][j];
if(N<4 || M<4)
{
cout<<0<<endl;
return 0;
}
for(int i=1;i<N-1;i++)
for(int j=1;j<M-1;j++)
if(judge(i,j))
b[i][j]=1;
int n=0;
for(int i=1;i<N-1;i++)
for(int j=1;j<M-1;j++)
{
num=0;
func(i,j);
if(num>n)
n=num;
}
cout<<n<<endl;
return 0;
}
分析
- 首先进行判断出满足浓密草丛的定义的所有草丛,然后再判断最大的一块是有多大