poj 2386 Laking Counting

Lake Counting

题目描述

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.


输入

  • 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.


输出

  • Line 1: The number of ponds in Farmer John’s field.

样例输入

10 12
W……..WW.
.WWW…..WWW
….WW…WW.
………WW.
………W..
..W……W..
.W.W…..WW.
W.W.W…..W.
.W.W……W.
..W…….W.


样例输出

3


题目大意

给出N*M的矩形土地以及土地中的积水位置(用W表示),要求整块矩形土地中的连续积水的区域数量

解题思路

1.采用深度优先搜索,对于一块连续的积水区域用一次深度优先搜索就可以将所有的W区域置为.
2.记录总共要进行几次这样的深度优先搜索,就是矩形区域内的连续积水区域的数量


代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include<stdio.h>
#include<iostream>
#include<sstream>
#include<cstring>

using namespace std;
#define mm(a) memset(a,1,sizeof(a))
char b[101][101];
int n,m;
int ans; //进行深度优先搜索的次数

void dfs(int a,int d) //深度优先搜索算法实现
{
b[a][d]='.';
int x,y,dx,dy;
for(dx=-1;dx<2;dx++)
for(dy=-1;dy<2;dy++)
{
x=a+dx;
y=d+dy;
if(x>0&&x<=n&&y>0&&y<=m&&b[x][y]=='W')
dfs(x,y);
}
return;
}

void solve()
{
ans=0;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>b[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(b[i][j]=='W')
{
dfs(i,j);
ans++;
}
}
cout<<ans<<endl;
}

int main()
{
std::ios::sync_with_stdio(false);
solve();
return 0;
}