【题目描述】
题意:有一块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
【思路】
主要是对深度优先搜索的运用,只要找到一处水洼,就将其变和四周变为干燥点,最后有多少个W就有所少个水洼。
【示例代码】
#include<bits/stdc++.h>
using namespace std;
char a[500][500];
int n,m,sum;
struct node{
int x,y;
};
queue<node>q;
int dx[8]={-1,-1,-1,0,1,1,1,0},dy[8]={-1,0,1,1,1,0,-1,-1};//八个方向
void bfs(int x,int y){
q.push({x,y});
a[x][y]='.';
while(!q.empty()){
node t=q.front();
q.pop();
for(int i=0;i<8;i++){
int xx=t.x+dx[i];
int yy=t.y+dy[i];
if(xx>=1&&xx<=n && yy>=1&&yy<=m && a[xx][yy]=='W'){
q.push({xx,yy});
a[xx][yy]='.';
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) cin>>a[i][j];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) {
if(a[i][j]=='W'){
sum++;
bfs(i,j);
}
}
}
cout<<sum;
return 0;
}