poj1562 Oil Deposits(DFS)
题目链接
http://poj.org/problem?id=1562
题意
输入一个m行n列的棋盘,棋盘上每个位置为'*'或者'@',求'@'的连通块有几个(连通为8连通,即上下左右,两条对角线)。
思路
floodfill问题,用dfs解决。
代码
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 const int N = 110; 7 char grid[N][N]; 8 int visit[N][N]; 9 int dir[8][2] = { //八个邻接点 10 {1, 0}, {-1, 0}, {0, 1}, {0, -1}, 11 {-1, -1}, {-1, 1}, {1, 1}, {1, -1} 12 }; 13 int m, n; 14 15 void dfs(int r, int c) 16 { 17 for(int i=0; i<8; i++) 18 { 19 int nr = r+dir[i][0]; 20 int nc = c+dir[i][1]; 21 22 if(nr>=0 && nr<m && nc>=0 && nc<n && grid[nr][nc]=='@' && !visit[nr][nc]) 23 { 24 visit[nr][nc] = 1; 25 dfs(nr, nc); 26 } 27 } 28 } 29 30 int main() 31 { 32 //freopen("poj1562.txt", "r", stdin); 33 while(cin>>m>>n && m) 34 { 35 for(int i=0; i<m; i++) 36 cin>>grid[i]; 37 38 memset(visit, 0, sizeof(visit)); 39 int cnt = 0; 40 for(int i=0; i<m; i++) 41 { 42 for(int j=0; j<n; j++) 43 { 44 if(grid[i][j]=='@' && !visit[i][j]) 45 { 46 visit[i][j] = 1; 47 dfs(i, j); 48 cnt++; 49 } 50 } 51 } 52 cout<<cnt<<endl; 53 } 54 return 0; 55 }
本站使用「CC BY-NC-SA」创作共享协议,转载请在文章明显位置注明作者及出处。