前言
圖(Graph)描述的是一些個體之間的關係。與線性表和二叉樹不同的是:這些個體之間既不是前驅後繼的順序關係,也不是祖先後代的層次關係,而是錯綜複雜的網狀關係。
例題6-12 油田(Oil Deposits,UVa 572)
題意:
輸入一個m行n列的字符矩陣,統計字符“@”組成多少個八連塊。如果兩個字符“@”所在的格子相鄰(橫、豎或者對角線方向),就說它們屬於同一個八連塊。
Sample Input
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0
Sample Output
0
1
2
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)。