P32: 积水计数

 “递归”是实现深度优先搜索的最好的方式。定义好规则然后就这样递归的循环下去直到走到终点

来自 <https://zh.wikipedia.org/wiki/%E6%B7%B1%E5%BA%A6%E4%BC%98%E5%85%88%E6%90%9C%E7%B4%A2>

/*
    P32: 积水计数
    核心:1块积水是连在一起的,所以可以在找到一个点是积水时,可以用深度优先搜索将他周围所有是积水的点
          都找出来,之所以用深度优先搜索是因为这样实现起来比较方便,定义好规则后直接递归即可。最后深度优先
          搜索结束时就找到了一块积水。深度优先搜索的次数就是积水块的块数。

运行结果:
*************************************************************************************
        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 <iostream>
#include <iterator>
#include <vector>
using namespace std;
const int MAX = 1010;
int N, M;
char field[MAX][MAX];
void dfs(int i, int j)
{
    int dx[] = {-1, 0, 1};
    int dy[] = {-1, 0, 1};
    field[i][j] = '.';

    for (int i2 = 0; i2 < 3; i2++)
        for (int j2 = 0; j2 < 3; j2++)
    {
        int nx = i + dx[i2];
        int ny = j + dy[j2];

        //下一个结点没出边界且依然是‘W’时继续进行深度优先搜索
        if(nx >= 0 && nx < N && ny >= 0 && ny < M && field[nx][ny] == 'W')
            dfs(nx, ny);
    }
}
int main(void)
{
    int count_dfs = 0;
    cin >> N >> M;
    for (int i = 0; i < N; i++)
        for (int j = 0; j < M; j++)
        cin >> field[i][j];



     for (int i = 0; i < N; i++)
        for (int j = 0; j < M; j++)
        {
            if (field[i][j] == 'W')
            {
                dfs(i, j);
                count_dfs++;
            }
        }

    cout << count_dfs;
}

 

posted on 2018-04-03 09:03  jkn1234  阅读(204)  评论(0编辑  收藏  举报