PKU 3051-Satellite Photographs

問題概要

上下左右のどれかで繋がっている場合島と見做せることにする.
最大の大きさの島を求めよ

解法

BFS

実装(C++)

#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
typedef pair<int,int> P;
int H,W;
char MAP[1000][82];
int d[4]={1,0,-1,0};
int solve(int x,int y){
	queue<P> que;que.push(P(x,y));
	int ans=1;
	MAP[x][y]='.';
	while(!que.empty()){
		P t=que.front();que.pop();
		for(int k=0;k<4;k++){
			int nx=t.first+d[k],ny=t.second+d[k^1];
			if(nx>=0&&nx<W&&ny>=0&&ny<H&&MAP[nx][ny]=='*'){
				MAP[nx][ny]='.';
				ans++;
				que.push(P(nx,ny));
			}
		}
	}
	return ans;
}
int main() {
	scanf("%d%d",&H,&W);
	for(int i=0;i<W;i++){
		scanf("%s",MAP[i]);
	}
	int ans=0;
	for(int y=0;y<H;y++){
		for(int x=0;x<W;x++){
			if(MAP[x][y]=='*'){
				ans=max(solve(x,y),ans);
			}
		}
	}
	printf("%d\n",ans);
	return 0;
}