蓝桥杯之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
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;
}

 

posted on 2017-10-19 20:30  迪迪菜源  阅读(348)  评论(0)    收藏  举报

导航