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\n", cnt);
    }
    return 0;
}
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM