问题描述
大小为N*M的菜园,因为下雨有积水,八连通的积水被认为连在一起构成一个水洼。计算菜园里有多少个水洼。(1 <= N <= 100; 1 <= M <= 100)
八连通指的是
***
*W*
***
输入
第一行是两个整数N, M,表示菜园的大小。
接下来有N行M列,句点’.’表示地面,大写‘W’表示积水。
输出
一行,表示满足要求的水洼数。
样例输入
扫描二维码关注公众号,回复:
4923011 查看本文章
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
#include<stdio.h>
#include<string.h>
#define MYDD 1103
int N,M;
char map[128][128];//记录积水的坐标点
int dx[]= {0,0,-1,1,1,1,-1,-1};//八连通的图
int dy[]= {-1,1,0,0,-1,1,-1,1};//当前位置周围的八个方向
void DFS(int x,int y) {
map[x][y]='.';//置当前位置没有积水
for(int j=0; j<8; j++) {
int gx=x+dx[j];
int gy=y+dy[j];
if(gx>=0&&gx<=N&&gy>=0&&gy<=M&&map[gx][gy]=='W') {
DFS(gx,gy);//满足条件继续查询
}
}
return ;
}
int main() {
scanf("%d%d",&N,&M);
for(int j=0; j<N; j++)
scanf("%s",map[j]);//键入地图
int ans=0;//记录答案
for(int j=0; j<N; j++) {
for(int k=0; k<M; k++) {
if(map[j][k]=='W') {//从有积水的地方遍历
DFS(j,k);
ans++;
}
}
}
printf("%d\n",ans);
return 0;
}
这种的输入最好是建一个文本文件,复制所给的数据进去,然后从命令行下自动读取测试,自己容易输错