Lake Counting
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 20221 | Accepted: 10189 |
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.
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.
* 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.
There are three ponds: one in the upper left, one in the lower left,and one along the right side.
深度优先搜索DFS,一行一行一列一列地遍历二维数组,如果是'W',就开始向周围八个方向深搜,某个方向相邻的也是'W',则继续向它的8个方向深搜,直到没有
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
int N,M;
char Field[110][110];
void DFS(int i,int j)
{
Field[i][j]='.'; //把是‘W’的全部换掉,表示已经数过了。。。
for(int dx=-1;dx<=1;dx++)
{
for(int dy=-1;dy<=1;dy++) //8个方向的遍历方法,学习了!!!棒!!!
{
int x=i+dx,y=j+dy;
if(x>=0 && x<N && y>=0 && y<M && Field[x][y]=='W') //N行M列,方阵做多了么?一开始都是N。。。
DFS(x,y); //继续DFS
}
}
}
int main()
{
freopen("2386.in","r",stdin); //别忘记删了。。。
// freopen("2386.out","w",stdout);
scanf("%d%d",&N,&M);
int countn=0;
for(int i=0;i<N;i++)
scanf("%s",Field[i]); //初始化二维数组,就是那个“Lake”
for(int i=0;i<N;i++) //深搜,一行一行地
for(int j=0;j<M;j++) //深搜,对每行,逐个判断
{
if(Field[i][j]=='W') //如果是'W',则Lake数量加一,开始向它的八个方向进行搜索
{
countn++;
DFS(i,j); //DFS
}
}
printf("%d\n",countn);
return 0;
}