[Poj 2386] Lake Counting, poj2386
Description
Due to recent rains, water has pooled in varous places in Farmer John's field, which is represented by a rectangle of N x M (1 <= N <= 100; 1 <= M <= 100) squares. each square contains either water ('W') or dry land ('. '). farmer John wowould like to figure out how sort ponds have formed in his field. A pond is a connected set of squares with water in them, where a square is considered adjacent to all eight of its neighbors.
Given a distriof Farmer John's field, determine how he ponds he has.
Input
* Line 1: Two space-separated integers: N and M
* Lines 2 .. N + 1: M characters per line representing one row of Farmer John's field. each character is either 'W' or '. '. the characters do not have spaces between them.
Output
* Line 1: The number of ponds in Farmer John's field.
Sample Input
10 12W........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
Output details:
There are three ponds: one in the upper left, one in the lower left, and one along the right side.
QuestionFind eight connected blocks, as shown below ....
QuestionStarting from any W, the adjacent part is replaced. After one DFS operation, all the WS connected to the initial W will be replaced with '.', so until W no longer exists in the figure, the total number of DFS operations is the answer. Eight statuses are transferred in eight directions. Each grid is called once as a DFS parameter, so the complexity is O (8 * N * M) = O (N * M ).
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<iostream> 5 using namespace std; 6 int n,m;char map[105][105]; 7 void dfs(int i,int j){ 8 map[i][j]='.'; 9 for(int dx=-1;dx<=1;dx++)10 for(int dy=-1;dy<=1;dy++){11 int nx=i+dx,ny=j+dy;12 if(nx>=0&&nx<n&&ny>=0&&ny<m&&map[nx][ny]=='W') dfs(nx,ny);13 }14 return ;15 }16 int main(){17 ios::sync_with_stdio(false);18 cin>>n>>m;19 for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>map[i][j];20 int ans=0;21 for(int i=0;i<n;i++)22 for(int j=0;j<m;j++){23 if(map[i][j]=='W'){24 dfs(i,j);25 ans++;26 }27 }28 printf("%d\n",ans);29 }