poj 2386 Lake Counting——BFS(队列)

题意:要数出池塘的数量,‘W’表示水,‘.’表示陆地。

思路:2个for循环遍历一遍,每一次选择是  ‘W’  且没被访问过的进行BFS搜索,搜索时可以走8个方向。

int dir[8][2]={{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}};

源代码:

#include<stdio.h>
#include<string.h>
int n,m,i,j,k,num,front,rear;
char data[205][205];
int vis[205][205]; 
int dir[8][2]={{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}};
struct ED
{
	int x,y;
}queue[10005],e;
void bfs()
{
	int i,j,xx,yy;
	num=0;
	for(i=0;i<n;i++)
	 for(j=0;j<m;j++)
	 if(vis[i][j]==0&&data[i][j]=='W')
	 {
		 front=rear=0;
		 queue[front].x=i;
	     queue[front].y=j;
	   while(front<=rear)
	   {
		xx=queue[front].x;
		yy=queue[front].y;
		front++;
		for(int l=0;l<8;l++)
		{
			e.x=xx+dir[l][0];
			e.y=yy+dir[l][1];;
			if(vis[e.x][e.y]==0 && data[e.x][e.y]=='W' && 
                           e.x>=0 && e.x<n && e.y>=0 && e.y<m)
			{
				++rear;
				queue[rear]=e;
				vis[e.x][e.y]=1; 
			}
		}
	   }
	   num++;
	 }
	printf("%d\n",num);
}
int main()  // Lake Counting
{
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		memset(vis,0,sizeof(vis));
		memset(data,-1,sizeof(data));
		memset(queue,-1,sizeof(queue));
		getchar();
		for(i=0;i<n;i++)
		  scanf("%s",data[i]);	
	        bfs();
	}
  return 0;
} 

你可能感兴趣的:(队列,bfs)