zoukankan      html  css  js  c++  java
  • DFS入门之二---DFS求连通块

    用DFS求连通块也是比较典型的问题, 求多维数组连通块的过程也称为--“种子填充”。

    我们给每次遍历过的连通块加上编号, 这样就可以避免一个格子访问多次。比较典型的问题是”八连块问题“。即任意两格子所在位置相邻(上下左右对角共八个方位),则在一个连通块。典型例题:HDU 1241 Oil Deposits

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

    题目描述:输入m行n列的字符矩阵, 统计字符“@”组成八连块的个数。

    题意分析:读入数据 -> 通过二重循环遍历该图->遇到‘@’且没有被访问过->DFS其连通块并作标记->输出

    代码(仅供参考):

    #include <cstdio>
    #include <cstring>
    const int maxn = 100 + 10;
    char a[maxn][maxn];
    int n, m, idx[maxn][maxn];
    
    void dfs(int r, int c, int id)
    {
        if(r < 0 || r >= m || c < 0 || c >= n) return ;
        if(idx[r][c] > 0 || a[r][c] != '@') return ;
        idx[r][c] = id;
        for(int i = -1; i <= 1; i++)
            for(int j = -1; j <= 1; j++)
                if(i != 0 || j != 0) dfs(r+i, c+j, id);
    }
    
    int main()
    {
        while(~scanf("%d%d", &m, &n)){
            if(n == 0 && m == 0) break;
            for(int i = 0; i < m; i++) scanf("%s", a[i]);
            memset(idx, 0, sizeof(idx));
            int cnt = 0;
            for(int i = 0; i < m; i++)
                for(int j = 0; j < n; j++)
                    if(idx[i][j] == 0 && a[i][j] == '@') dfs(i, j, ++cnt);
            printf("%d
    ", cnt);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    1026 Table Tennis (30)
    1029 Median
    1025 PAT Ranking (25)
    1017 Queueing at Bank (25)
    1014 Waiting in Line (30)
    1057 Stack (30)
    1010 Radix (25)
    1008 Elevator (20)
    字母大小写转换
    Nmap的基础知识
  • 原文地址:https://www.cnblogs.com/ACFLOOD/p/4231756.html
Copyright © 2011-2022 走看看