描述
有一块N×M的土地,雨后积起了水,有水标记为‘W’,干燥为‘.’。八连通的积水被认为是连接在一起的。请求出院子里共有多少水洼?
格式
输入格式
第一行为N,M(1≤N,M≤110)。 下面为N*M的土地示意图。
输出格式
一行,共有的水洼数。
样例
输入样例
10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
输出样例
3
限制
时间限制: 1000 ms
内存限制: 65536 KB
八联通问题,很简单
struct node{
int x,y;
}nod;
int n,m;
char dt[110][110];
bool mp[110][110]={false};
int dx[8]={1,-1,0,0,1,-1,1,-1};
int dy[8]={0,0,1,-1,1,1,-1,-1};
bool judge(int x,int y){
if(x<0||x>=n||y<0||y>=m) return false;
if(mp[x][y]==true||dt[x][y]=='.') return false;
return true;
}
void bfs(int a,int b){
queue<node> q;
nod.x=a;
nod.y=b;
mp[a][b]=true;
q.push(nod);
while(!q.empty()){
node top=q.front();
q.pop();
for(int i=0;i<8;i++){
int newx=top.x+dx[i];
int newy=top.y+dy[i];
if(judge(newx,newy)){
nod.x=newx;
nod.y=newy;
q.push(nod);
mp[newx][newy]=true;
}
}
}
}
int main(){
scanf("%d%d%*c",&n,&m);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%c",&dt[i][j]);
}
scanf("%*c");
}
int sum=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(dt[i][j]=='W'&&mp[i][j]==false){
sum++;
bfs(i,j);
}
}
}
printf("%d\n",sum);
return 0;
}