POJ-lake counting-No.2386
题目描述:
链接:http://poj.org/problem?id=2386。
这个题用’W’代表水洼,用‘.’代表空地,W相互连接的地方为一处水洼。
求有多少处水洼。
题目分析:
这个题是我接触的第一道深度优先搜索的题目,可以进行DFS,从一处W开始,进行搜索,将所有相连的W变为.,然后找到一处W,继续进行DFS。
然后进行DFS的次数即为有多少处水洼。
写这个题学到了一个地方:
for(i=1;i<=x;i++)
{
for(j=1;j<=y;j++)
{
if(num[i][j]=='W')
{
count++;
com(num,x,y,i,j);
i=1;
j=1;
}
}
}
可以用这种方法表示向八个方向进行移动。
给出代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void com(char num[110][110],int x,int y,int a,int b);
int count=0;
int main()
{
char num[110][110];
memset(num,0,sizeof(num));
int x,y;
scanf("%d%d",&x,&y);
char space;
space=getchar();
int i,j;
for(i=1;i<=x;i++)
{
for(j=1;j<=y;j++)
{
scanf("%c",&num[i][j]);
}
space=getchar();
}
for(i=1;i<=x;i++)
{
for(j=1;j<=y;j++)
{
if(num[i][j]=='W')
{
count++;
com(num,x,y,i,j);
i=1;
j=1;
}
}
}
printf("%d\n",count);
return 0;
}
void com(char num[110][110],int x,int y,int a,int b)
{
//printf("%d %d\n",a,b);
//printf("%c\n",num[a][b]);
if(num[a][b]=='.')
{ //printf("PRZ\n");
return;
}
if(num[a][b]=='W')
{
num[a][b]='.';
int i,j;
for(i=-1;i<=1;i++)
{
for(j=-1;j<=1;j++)
{
int a1=a+i;
int b1=b+j;
//printf("**%d %d\n",a1,b1);
if(a1>0&&a1<=x&&b1>0&&b1<=y)
{
//printf("ORZ\n");
com(num,x,y,a1,b1);
//printf("ORZ\n");
}
}
}
return;
}
return;
}