1 # include<cstdio> 2 # include<iostream> 3 4 using namespace std; 5 6 # define MAX 123 7 8 char grid[MAX][MAX]; 9 int nxt[8][2] = { {1,0},{0,-1},{-1,0},{0,1},{1,1},{1,-1},{-1,1},{-1,-1} }; 10 int n,m; 11 12 int can_move( int x,int y ) 13 { 14 if ( x>=0&&x<n&&y>=0&&y<m ) 15 { 16 if ( grid[x][y]==‘W‘ ) 17 return 1; 18 } 19 return 0; 20 } 21 22 23 void dfs ( int x,int y ) 24 { 25 grid[x][y] = ‘.‘; 26 for ( int i = 0;i < 8;i++ ) 27 { 28 int n_x = x+nxt[i][0], n_y = y+nxt[i][1]; 29 if ( can_move(n_x,n_y) ) 30 { 31 dfs(n_x,n_y); 32 } 33 } 34 return; 35 } 36 37 38 int main(void) 39 { 40 //int n,m; 41 int res; 42 while ( scanf("%d%d",&n,&m)!=EOF ) 43 { 44 res = 0; 45 for ( int i = 0;i < n;i++ ) 46 scanf("%s",grid[i]); 47 for ( int i = 0;i < n;i++ ) 48 { 49 for ( int j = 0;j < m;j++ ) 50 { 51 if ( grid[i][j]==‘W‘ ) 52 { 53 dfs(i,j); 54 res++; 55 } 56 } 57 } 58 printf("%d\n",res); 59 } 60 61 62 return 0; 63 }
A - Lake Counting
Description
Input
Output
Sample Input
10 12 W........WW. .WWW.....WWW ....WW...WW. .........WW. .........W.. ..W......W.. .W.W.....WW. W.W.W.....W. .W.W......W. ..W.......W.
Sample Output
3
Hint
题目大意:
就是说一个n*m的网格中,求出联通块的个数。
解题思路:
就是一个dfs的基础题,从任意一个满足要求的点开始dfs,求出直到不能走动为止,res++。
复杂度:
O(8*m*n)
代码:
《挑战》2.1 POJ 2386 Lake Counting (简单的dfs)
原文:http://www.cnblogs.com/wikioibai/p/4675094.html