DFS求連通塊(UVa 572)
阿新 • • 發佈:2019-01-24
圖:
圖描述的是一些個體之間的關係與現行表和二叉樹不同的是:這些個體之間既不*是前驅後繼的關係,也不是祖先後代的層次關係,而是錯綜複雜的網狀結構
油田(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;
}