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
  • 相关阅读:
    交易是如何被创建和打包的7
    重回js--js中的块作用域
    重回js--立即执行函数
    解决json跨域
    h5开发安卓ios坑总结
    关于html中对换行的处理
    说说display-inline
    笔记--学习git命令(基本命令版)
    写在最开始
    替换多个文件中的部分内容Demo
  • 原文地址:https://www.cnblogs.com/ACFLOOD/p/4231756.html
Copyright © 2011-2022 走看看