Lake Counting
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 35731 | Accepted: 17734 |
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
题意:有一个大小为n*m的园子,求出水洼的个数,一个W是一个水洼,多个连着的W也是一个水洼,也就是一个或者多个连着的W组成一个水洼,W表示积水,'.'表示没有积水
这道题目贼坑!算是深搜里的水题了吧!
我用了两种表示方式做
(1)
#include<stdio.h>
int n,m;
char field[1000][1000];
int res;
void dfs(int x,int y )
{
int dx,dy,nx,ny;
field[x][y]='.';//讲现在所在的位置替换为'.'
for(dx=-1;dx<=1;dx++)
{
for(dy=-1;dy<=1;dy++)
{
nx=dx+x;
ny=dy+y;
if(0<=nx&&nx<n&&0<=ny&&ny<m&&field[nx][ny]=='W')dfs(nx,ny);//判断(nx,ny)是不是在园子里,是否有积水
}
}
}
int main()
{
int i,j;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
{
getchar();
for(j=0;j<m;j++)
{
scanf("%c",&field[i][j]);
}
}
res=0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(field[i][j]=='W')
{
dfs(i,j);
res++;
}
}
}
printf("%d\n",res);
return 0;
}
(2)
#include<stdio.h>
char map[1000][1000];
int n,m;
int a[8][2]={{1,1},{1,0},{1,-1},{0,1},{0,-1},{-1,0},{-1,1},{-1,-1}};
int ans;
void dfs(int x,int y)
{
int i,dx,dy;
map[x][y]='.';
for(i=0;i<8;i++)
{
dx=x+a[i][0];
dy=y+a[i][1];
if(dx>=0&&dx<n&&dy>=0&&dy<m&&map[dx][dy]=='W') dfs(dx,dy);
}
}
int main()
{
int i,j;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
{
getchar();
for(j=0;j<m;j++)
{
scanf("%c",&map[i][j]);
}
}
ans=0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(map[i][j]=='W')
{
dfs(i,j);
ans++;
}
}
}
printf("%d\n",ans);
return 0;
}