1. 程式人生 > >DFS求連通塊(UVa 572)

DFS求連通塊(UVa 572)

圖:

圖描述的是一些個體之間的關係與現行表和二叉樹不同的是:這些個體之間既不*是前驅後繼的關係,也不是祖先後代的層次關係,而是錯綜複雜的網狀結構

油田(Oil Deposits,UVa 572)
輸入一個m行n列的字元矩陣,統計字元“@”組成多少個“八連塊”。如果兩個字元“@”所在的格子相鄰(橫丶豎或者對角線方向),就是說它們同屬於一個八連塊。例如:

樣例輸入:

1 1
*
3 5
@@*
@
@@*
1 8
@@**@*
5 5
**@
@@@
@*@
@@@*@
@@**@
0 0

樣例輸出:

0
1
2
2

DFS很容易編寫

程式碼如下

#include<iostream>
#include<stdio.h> #include<cstring> using namespace std; const int maxn = 100 + 5; int m, n, idx[maxn][maxn]; char pic[maxn][maxn]; void dfs(int i, int j, int count) { if(i < 0 || i >=m || j < 0 || j >= n) return; if(idx[i][j] > 0 || pic[i][j] != '@') return; idx[i][j] = count; for
(int dr = -1; dr < 2; dr++){ for(int dc = -1; dc < 2; dc++){ if(dr != 0 || dc != 0){ dfs(i+dr, j+dc, count); } } } } int main() { while(scanf("%d%d", &m, &n) == 2){ for(int i = 0; i < m; i++){ scanf("%s"
, pic[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 && pic[i][j] == '@') dfs(i, j, ++cnt); } } cout<<cnt<<endl; } return 0; }