题目描述
题意:有一块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.
样例输出
3
题目类型
DFS;
代码
#include<bits/stdc++.h>
using namespace std;
/*用sum记录水洼数量,先用ma[][]记录这个地图,输入时将W记为1,其余不管。然后开始从左上角开始遍历数组元素。
便利某一个元素时,如果其值为一,先设为零,就沿着它的八个方向寻找有水的节点,并将找到的节点也设为零,寻找它周围有水的节点,不断重复。
当周围没有有水的节点时,说明这个水洼的所有点都已走过,并将值改为了0,这时可以将sum++.*/
int m,n,sum=0,ma[115][115];
int dir[8][2]={0,1,1,0,-1,0,0,-1,1,1,1,-1,-1,1,-1,-1};
void dfs(int x,int y){
for(int i=0;i<8;i++){
int xx=x+dir[i][0],yy=y+dir[i][1];
if(xx<n&&xx>=0&&yy<m&&yy>=0&&ma[xx][yy]){
ma[xx][yy]=0;
dfs(xx,yy);
}
}
}
int main(void){
char x;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
getchar();
for(int j=0;j<m;j++){
scanf("%c",&x);
if(x=='W') ma[i][j]=1;
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(ma[i][j]) {
ma[i][j]=0;
sum++;dfs(i,j);
}
}
}
printf("%d",sum);
}