DFS入门之一

深度优先搜索实现较为简单,需要控制两个因素:

1.已经访问过的元素不能再访问,在实际题目中还要加上不能访问的元素(障碍)

2.越界这种情况是不允许的

以杭电的1312 Red and Black 为例, 这是一道典型的DFS题目

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1312

题目大意:'@'代表起始位置, '.' 代表黑点(可以穿越),'#' 代表红点(障碍) 要求统计最多可以覆盖多少个黑点

题目分析:确定起始位置 -> 开始DFS -> 如果不是非法位置,计数一次 -> 递归的搜索四个方向(UP, DOWN, LEFT, RIGHT) ->结束

附上我的代码(仅供参考):

#include <cstdio>

#include <cstring>

const int maxn = 50 + 10;

char a[maxn][maxn];

int w, h, idx[maxn][maxn], cnt;

int dfs(int r, int c, int id)

{

    if(r < 0 || r >= h || c < 0 || c >= w) return 0;

    if(idx[r][c] > 0 || a[r][c] == '#') return 0;

    idx[r][c] = id;

    cnt++;

    for(int i = -1; i <= 1; i++)

        for(int j = -1; j <= 1; j++)

            if((i == 0 && j != 0)||(i != 0 && j == 0)) dfs(r+i, c+j, id);

}



int main()

{

    int r, c;

    while(~scanf("%d%d", &w, &h)){

        cnt = 0;

        if(w == 0 && h == 0) break;

        for(int i = 0; i < h; i++) scanf("%s", a[i]);

        memset(idx, 0, sizeof(idx));

        for(int i  = 0; i < h; i++)

            for(int j = 0; j < w; j++)

                if(a[i][j] == '@'){

                    r = i;

                    c = j;

                }

        dfs(r, c, 1);

        printf("%d\n", cnt);

    }

    return 0;

}
参考一下?

 

你可能感兴趣的:(DFS)