2801 Problem A Lake Counting
题目描述
题意:有一块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); }