1. 程式人生 > >種子填充(flood fill)

種子填充(flood fill)

針對UVa 572

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 const int maxn = 100 + 5;
 6 //m 行 n 列
 7 // pic存圖,idx就是visit陣列 
 8 char pic[maxn][maxn];
 9 int m,n,idx[maxn][maxn];
10 
11 void dfs(int r,int c,int id)
12 {
13     if(r<0 || r>=m || c<0 || c>= n) return
;//出界 14 if(idx[r][c]>0 || pic[r][c]!='@') return ; 15 idx[r][c] = id;//連通分量編號 16 17 //下面的迴圈可以寫一個方向陣列進行修改 18 for(int dr = -1;dr <= 1;dr ++) 19 for(int dc = -1;dc <= 1;dc ++) 20 if(dr != 0 || dc != 0) 21 dfs(r+dr,c+dc,id); 22 }
23 24 25 26 int main() 27 { 28 while(scanf("%d%d",&m,&n) == 2 && m && n) 29 { 30 for(int i = 0;i < m;i ++) 31 scanf("%s",pic[i]); 32 memset(idx,0,sizeof(idx)); 33 int cnt = 0; 34 for(int i = 0;i < m;i ++) 35 {
36 for(int j = 0;j < n;j ++) 37 { 38 if(idx[i][j]==0&&pic[i][j] == '@') 39 { 40 dfs(i,j,++cnt); 41 } 42 } 43 } 44 cout << cnt << endl; 45 } 46 return 0; 47 }