广度优先搜索模板(poj2251)

 

我的广度优先搜索的大致框架。。

【代码】:

#include <iostream> 
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;

typedef struct
{
	int x,y,z;
	int n;
}Point;

int dir[6][3]={-1,0,0,1,0,0,0,-1,0,0,1,0,0,0,-1,0,0,1};

char map[31][31][31];
int l,r,c,ans,flag[31][31][31];

int Judge(int x,int y,int z)
{
	if(x>=0 && x<l && y>=0 && y<r && z>=0 && z<c)
	    return 1;
	else
		return 0;  
}

void bfs(int x,int y,int z)
{
	queue<Point> q;
	Point p0,p1,p2;
	
	memset(flag,0,sizeof(flag));
	p0.x=x;p0.y=y;p0.z=z;p0.n=0;
	flag[x][y][z]=1;
	q.push(p0);
	
	while(!q.empty())
	{
		p1=q.front();q.pop();
		for(int i=0;i<6;i++)
		{
			int temp1=p1.x+dir[i][0];
			int temp2=p1.y+dir[i][1];
			int temp3=p1.z+dir[i][2];
			if(Judge(temp1,temp2,temp3) && !flag[temp1][temp2][temp3] && map[temp1][temp2][temp3]!='#')
			{
				if(map[temp1][temp2][temp3]=='E'){
					ans=p1.n+1;return;
				}
				p2.x=temp1;p2.y=temp2;p2.z=temp3;p2.n=p1.n+1;
				flag[temp1][temp2][temp3]=1;
				q.push(p2);
			}
		}
	}
}

int main(){
	//freopen("input.txt","r",stdin);
	int i,j,k,si,sj,sk;
	while(~scanf("%d%d%d",&l,&r,&c))
	{
		if(l==0 && r==0 && c==0) break;
		
		for(i=0;i<l;i++)
			for(j=0;j<r;j++){
				scanf("%s",map[i][j]);
				for(k=0;k<strlen(map[i][j]);k++)
					if(map[i][j][k]=='S'){
				    	si=i;sj=j;sk=k;
					}
			}
		
		ans=-1;
		bfs(si,sj,sk);
		
		if(ans!=-1) 
		    printf("Escaped in %d minute(s).\n",ans);
		else
		    printf("Trapped!\n");
	}
	return 0;
}


 

posted on 2013-07-28 21:49  Gddxz  阅读(305)  评论(0编辑  收藏  举报

导航