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.
问题描述:
有一个大小为N*M的园子,雨后积了很多水。八连通的积水被认为是在一起的。请求出园子里共有多少个水洼?(八连通是指下图中相对+的*部分)
+++
+*+
+++
解题分析:
从任意的’+’开始,不停地把邻接的部分用’*’代替,一次dfs(深度优先遍历)遍历后,与初始的这个+所连接的所有+都会被替换成*,因此直到图中没有+为止,总共进行dfs的次数即为积水的次数。
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
char a[1001][1001];
int n,m;
void DFS(int x,int y)
{
int i,j,b,c;
for(i=-1;i<=1;i++){
for(j=-1;j<=1;j++){
b=i+x;//代表了八个方向 (i-1,j-1) (i-1,j) (i-1,j+1) (i,j-1)
c=y+j;// (i,j+1) (i+1,j-1) (i+1,j) (i+1,j+1)
if(b>=0&&b<n&&y>=0&&y<m&&a[b][c]=='W')
{
a[b][c]='.';//如果改点是 ’W' 的话 就另 该点是 '.' 以后也不访问他
DFS(b,c);// 去搜索该点
}
}
}
}
int main()
{
int i,j,flag=0;
while(scanf("%d %d",&n,&m)!=EOF){
memset(a,'0',sizeof(a));
flag=0;
for(i=0;i<=n-1;i++)
scanf("%s",a[i]);
for(i=0;i<=n-1;i++){
for(j=0;j<=m-1;j++){
if(a[i][j]=='W'){
flag++;//遇见一个水洼 就加加
DFS(i,j);//去搜索这一点的八个方向
}
}
}
printf("%d\n",flag);
}
return 0;
}