单点时限: 2.0 sec
内存限制: 256 MB
jim 通过 Google 得到了华师大 W * H 像素的卫星照片 (1⩽W⩽80,1⩽H⩽1000),希望找出最大的 ” 连续的 “(互相连接的) 建筑。对于一个建筑的任何一对像素,其中一个像素如果能横向的或纵向的与属于这个建筑的另一个像素相连,这样的建筑称作是连续的。每一张照片都数字化了,建筑区显示为 “*“, 非建筑区显示为 “.”。
下面是一个 10 × 5 的卫星照片样例 :
…*…**
.…***
.……
…*.
…*.
这张照片显示了大小分别为 4、16、6 个像素的连续建筑区。帮助 jim 在他的每张卫星照片中找到最大的连续建筑。
输入格式
第 1 行 : 两个由空格分开的整数,W 和 H。
第 2 到 H+1 行 : 每一行包含 W 个 “*” 或者 “.”,代表卫星照片的横向行。
输出格式
输出仅 1 行 : 最大连续建筑的像素大小。
样例
input
10 5
10 5
……**
.…***
.……
….
…*.
output
16
/*
思路:广度优先遍历即可。
*/
#include<iostream>
#include<queue>
using namespace std;
const int M = 1000;
int x[4]={0,0,1,-1};
int y[4]={1,-1,0,0};
bool visit[M][M]={false};
char s[100][100];
int h,w;
struct g
{
int x;
int y;
int len;
}G;
bool text(int a,int b)
{
if(a<0||b<0||a>=h||b>=w||visit[a][b]==true||s[a][b]=='.')
return false;
return true;
}
int bfs(int a,int b)
{
visit[a][b]=true;
G.x=a,G.y=b;
int ans=0;
queue<g>q;
q.push(G);
while(!q.empty())
{
ans++;
g f = q.front();
q.pop();
for(int i = 0; i < 4;i++)
{
int X=f.x+x[i];
int Y=f.y+y[i];
if(text(X,Y))
{
g t;
t.x=X;
t.y=Y;
q.push(t);
visit[X][Y]=true;
}
}
}
return ans;
}
int main()
{
cin>>w>>h;
for(int i = 0;i < h; i++)
for(int j = 0; j < w; j++)
cin>>s[i][j];
int Max=0;
for(int i =0; i<h; i++)
{
for(int j = 0; j < w; j++)
{
if(s[i][j]=='*'&&visit[i][j]==false)
{
Max=max(Max,bfs(i,j));
}
}
}
cout<<Max;
return 0;
}