zoukankan      html  css  js  c++  java
  • 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;
    }
    参考一下?
  • 相关阅读:
    剑指offer---尾到头打印链表
    剑指offer---链表中环的入口结点
    剑指offer---删除链表中重复的结点2
    剑指offer---删除链表中重复的结点
    6.shap以及selector的使用
    7.进度条(ProgressBar)
    5.toogleButton以及Switch
    4.基础控件
    3.触摸事件
    2.点击事件和页面切换
  • 原文地址:https://www.cnblogs.com/ACFLOOD/p/4231530.html
Copyright © 2011-2022 走看看