B F S BFS BFS
枚举每一个点的位置并向周围拓展,找到它的面积和周长,最后求出最大的那块冰淇凌并输出。
面积:这个冰激凌球里面“#”的个数.
周长:就是“#”处在边界或周围没有冰淇淋块就+1.
最后——附上代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int xx[1000010],yy[1000010],a[1010][1010],v[1010][1010];
int n,mj,zc,ans_mj,ans_zc;
int dx[5]={0,0,0,1,-1};
int dy[5]={0,1,-1,0,0};
char c;
void bfs(int x,int y)
{
int head=0,tail=1;
v[x][y]=1;
xx[tail]=x;
yy[tail]=y;
while(head<tail)
{
head++;
for(int i=1; i<=4; i++) //向四个方向拓展
{
int x1=dx[i]+xx[head],y1=dy[i]+yy[head];
if(x1>=0&&x1<=n+1&&y1>=0&&y1<=n+1)
if(v[x1][y1]==0)
{
if(a[x1][y1]==0) //处在边界或周围没有冰淇淋块
zc++; //周长
else
{
mj++,tail++; //面积++,队列向前推
xx[tail]=x1;
yy[tail]=y1;
v[x1][y1]=1; //到过了
}
}
}
}
}
int main()
{
freopen("perimeter.in","r",stdin);
freopen("perimeter.out","w",stdout);
cin>>n;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
cin>>c;
if(c=='#')
a[i][j]=1;
}
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(a[i][j]==1&&v[i][j]==0)
{
mj=1,zc=0; //清零
bfs(i,j);
if(mj==ans_mj&&zc<ans_zc) //比较求最大
ans_zc=zc;
else if(mj>ans_mj)
ans_mj=mj,ans_zc=zc;
}
cout<<ans_mj<<' '<<ans_zc;
return 0;
}