【poj 2386】Lake Counting

2018-06-17 21:51:49来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

Description

Due to recent rains, water has pooled in various 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 would like to figure out how many 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 diagram of Farmer John's field, determine how many 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 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

OUTPUT DETAILS:

There are three ponds: one in the upper left, one in the lower left,and one along the right side.
题意
求八连通块,如下:
.  .  .
. W .
.  .  .
题解
从任意的W开始,不停地把邻接的部分用'.'代替。1次DFS后与初始的这个W连接的所有W就都被替换成了'.',
因此直到图中不再存在W为止,总共进行DFS的次数就是答案了。8个方向共对应了8种状态转移,每个格子作为DFS的参数至多被调用一次,所以复杂度为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 }

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:c++ 中常量与变量 基本数据类型

下一篇:C++11 新知识点