蓝桥杯之dfs练习
有一个大小为N*M的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请求出院子里共有多少片积水(八连通指的是下图中相对w的*部分)
***
*w*
***
限制条件:N,M<=100
输入:
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*
***
限制条件:N,M<=100
输入:
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
C代码:
#include<stdio.h> char field[200][200];//园子大小 int M,N; void dfs(int x,int y) { field[x][y] = '.';//将现在的位置替换为“.” for(int dx = -1; dx <= 1; dx++) for(int dy = -1; dy <= 1; dy++)//循环遍历的8个方向 { int nx = x + dx, ny = y + dy;//向x方向移动dx,向y方向移动dy,移动的结果为(nx,ny) if(0 <= nx && nx < N && 0 <= ny && ny < M && field[nx][ny] == 'w') dfs(nx,ny);//判断(nx,ny)是不是在园子里面,以及是否有积水 } return ; } void solve() { int res = 0; for(int i = 0; i < N; i++) for(int j = 0; j < M; j++) { if(field[i][j] == 'w') { dfs(i,j);//从有w的地方开始dfs res++; } } printf("%d\n",res); } int main() { while(scanf("%d%d",&N,&M) == 2) { for(int i = 0; i < N; i++) { scanf("%s",field[i]); } solve(); } return 0; }
浙公网安备 33010602011771号