1. 程式人生 > >用dfs求聯通塊(UVa572)

用dfs求聯通塊(UVa572)

一個 urn 標記 連通 spa dfs ios mes max

一、題目

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

二、解題思路

和前面的二叉樹遍歷類似,圖也有DFS和BFS遍歷。由於DFS更容易編寫,一般用DFS找聯通塊:從每個“@”格子出發,遞歸遍歷與之相鄰的“@”格子,標記相同的“聯通分量標號”。這樣在訪問之前需檢查它是否已經有了編號,從而避免一個格子訪問多次。

三、代碼實現

 1 #include<stdio.h>
 2 #include<iostream>
 3 using namespace std;
 4 
 5 const
int maxn = 100 + 10; 6 char field[maxn][maxn]; 7 int N, M; 8 9 void dfs(int x, int y) 10 { 11 field[x][y] = *; //這裏通過把“@”換成“*”,從而避免重復 12 for (int dx = -1; dx <= 1; dx++) 13 for (int dy = -1; dy <= 1; dy++) 14 { 15 int nx = x + dx; int ny = y + dy;
16 if (nx >= 0 && nx < N && ny >= 0 && ny < M && field[nx][ny] == @) 17 dfs(nx, ny); 18 } 19 return; 20 } 21 void slove() 22 { 23 int res = 0; 24 for (int i = 0; i < N; i++) 25 for (int j = 0; j < M; j++)
26 { 27 if (field[i][j] == @) 28 { 29 dfs(i, j); 30 res++; //遍歷完一個連通分量,答案加一 31 } 32 } 33 printf("%d\n", res); 34 } 35 int main() 36 { 37 while (scanf("%d%d", &N, &M) == 2 && N) 38 { 39 for (int i = 0; i < N; i++) 40 for (int j = 0; j < M; j++) 41 cin >> field[i][j]; 42 43 slove(); 44 } 45 return 0; 46 }

用dfs求聯通塊(UVa572)