深度搜索DFS-Lake Counting(POJ NO.2386)

来源:互联网 发布:会计核算软件 编辑:程序博客网 时间:2024/06/01 07:25

题目链接POJ NO.2386

解题思路:

这个也是一个dfs 的应用,在书上的例子,因为书上的代码并不全,基本都是函数分块来写,通过这个题目也规范了代码,以后能用函数的就都用函数来实现吧。采用深度优先搜索,从任意的w开始,不断把邻接的部分用'.'代替,1次DFS后与初始这个w连接的所有w就全都被替换成'.',因此直到图中不再存在W为止,总共进行DFS的次数就是答案。8个方向对应8个状态转移,每个格子作为DFS的参数最多调用一次,因此时间复杂度为O(8nm)=O(nm)。

AC 代码:

#include <iostream>  #include<cstdio>  using namespace std;#define maxn 105  char field[maxn][maxn];//园子int n, m;void dfs(int x, int y){   //将现在所在位置替换为.    field[x][y] = '.';    //循环遍历八个方向      for (int dx = -1; dx <= 1; dx++)     {//向x方向一定dx,向y方向移动dy,移动结果为(nx,ny)        for (int dy = -1; dy <= 1; dy++)         {            int nx = x + dx, ny = y + dy;//x,y 都是原来的坐标            //判断(nx,ny)是否在园子里,以及是否有积水              if (0 <= nx&&nx<n && 0 <= ny&&ny<m&&field[nx][ny] == 'W')             {                dfs(nx, ny);            }        }    }}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);                res++;            }        }    }    printf("%d\n", res);}int main(){    scanf("%d%d", &n, &m);//n是行,m是列    for (int i = 0; i<n; i++) //仅仅是一个二维数组的输入    {        for (int j = 0; j<m; j++)         {            cin >> field[i][j];        }    }    solve();//这样写很好,函数分块    return 0;}

通过这个题目进一步加深了对dfs算法的理解,最重要的是以后可以很好的还原书上的代码(开心),只要用一个main 函数把基本的输入格式弄好就好了,自己还是很弱啊,继续加油吧