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
", cnt);
    }
    return 0;
}
参考一下?
原文地址:https://www.cnblogs.com/ACFLOOD/p/4231530.html