用DFS求連通塊 (種子填充(floodfill))

 

前言

  圖(Graph)描述的是一些個體之間的關係。與線性表和二叉樹不同的是:這些個體之間既不是前驅後繼的順序關係,也不是祖先後代的層次關係,而是錯綜複雜的網狀關係。

例題6-12 油田(Oil Deposits,UVa 572)

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


Sample Input

1 1 

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


 

Sample Output




2

 



-代碼如下

#include <cstdio>
#include <cstring>
const int maxn = 100 + 5;

char pic[maxn][maxn];
int m, n , idx[maxn][maxn];

void dfs(int r, int c, int id) {
	if (r < 0 || r >=m || c >=n) return ; //“出界”的格子
	if (idx[r][c] > 0 || pic[r][c] != '@') return ; //不是"@"或者已經訪問過的格子
	idx[r][c] = id; //連通分量編號
	for (int dr = -1; dr <= 1; dr++)
		for (int dc = -1; dc <= 1; dc++)
			if (dr != 0 || dc != 0) dfs(r+dr, c+dc, id);
}

int main() {
	while (scanf("%d%d",&m,&n) == 2 && m && n) {
		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);
		printf("%d\n",cnt);
	}
	return 0;
}

 

圖也有DFS遍歷和BFS遍歷,其中前者用遞歸實現,後者用隊列實現。求多維數組連通塊的過程也成爲種子填充(floodfill)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章