POJ 2386 Lake Counting

题目传送门:http://poj.org/problem?id=2386

题目大意:给你一张图代表农民的田地,其中'W'代表有水的格子,‘.’代表干地。有水的格子连在一起就是一个水池,问给定的一块土地上有几个水池。


题目思路:

实际是是个很简单的题目,貌似是用BFS做,但是我还没想好,稍后奉上BFS版本。

我用的是DFS做的,把 图读完之后,开始遍历,遇到W字符的时候开始进行深搜,每次向八个方向进行深搜,每次把W的地方标记好,直到搜到八个方向都没有没有搜索过的带有W的点,或者都是干地,那么退出,算一个池塘,计数+1.之后再继续进行遍历,直到把 图遍历完,答案也就出来了。这里我感觉,题目的意思应该是一个带有w的格子也算作 是一个水池,不一定要连接几个有W的格子以上才叫做水池,事实上,在遍历的过程中,只要遇到W的格子就算作一个水池,DFS只不过是用于把他周围的W格子全都标记,以至于下次在搜索的时候不会再计数。



代码如下:

   
   
 
//Lake Counting//
//题目链接:http://poj.org/problem?id=2386
#include<stdio.h>
#include<string.h>
char map[150][150];
bool vis[150][150];
int x_move[8]={0,0,-1,1,-1,1,-1,1};
int y_move[8]={1,-1,0,0,1,1,-1,-1};
int N,M;
int count;
int is_water(int a,int b)
{
	if(map[a][b]=='W')
		return 1;
	else
		return 0;
}
void DFS(int x,int y)
{
	int i;
	int tx,ty;
	if(map[x][y]=='.')
		return ;
	for(i=0;i<8;i++)
	{
		tx=x+x_move[i];
		ty=y+y_move[i];
		if(tx<1||tx>N||ty<1||ty>M)    //不超边界
			continue;
		if(is_water(tx,ty)&&vis[tx][ty]==0)
		{
			vis[tx][ty]=1;
			DFS(tx,ty);
		}
	}
}
int main()
{
	int i,j;
	while(scanf("%d%d",&N,&M)!=EOF)
	{
		getchar();
		count=0;
		memset(vis,0,sizeof(vis));
		for(i=1;i<=N;i++)
		{
			for(j=1;j<=M;j++)
				scanf("%c",&map[i][j]);
			getchar();
		}
		for(i=1;i<=N;i++)
		{
			for(j=1;j<=M;j++)
			{
				if(map[i][j]=='W'&&vis[i][j]==0)
				{
					count++;
					vis[i][j]=1;
					DFS(i,j);
				}
			}
		}
		printf("%d\n",count);
	}
	return 0;
}


你可能感兴趣的:(POJ 2386 Lake Counting)