POJ 2251 三维BFS (求最短时间

题目链接

题目大意:

三维的空间,起始位置是 S  出口在  E   问最短多少时间可以逃出来

解题思路:

把二维的 bfs 换成三维  套模板就行

代码如下:
 

#include<iostream>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
char map[55][55][55];//存地图 
bool vis[55][55][55];//标记
int d[6][3]={
   
   {1,0,0},{-1,0,0},{0,0,1},{0,0,-1},{0,1,0},{0,-1,0}};
int flag;//标记是否到达目标点 
int head;//当前指针 
int tail; //入队指针 
int ans=0;//最小时间 
int l,r,c;
struct node
{
	int x;//层数 
	int y;//长度 
	int z;//宽度 
	int t;//最小时间 
}a[100000];

bool judge(int x,int y,int z)
{
	if(map[x][y][z]=='#'||x<0||x>=l||y<0||y>=r||z<0||z>=c)
	{
		return false;
	}
	else
	   return true;
}

void bfs()
{
	while(head<tail)
	{
		for(int i=0;i<6;i++)
		{
			int xx=a[head].x+d[i][0];
			int yy=a[head].y+d[i][1];
			int zz=a[head].z+d[i][2];
			if(judge(xx,yy,zz)&&vis[xx][yy][zz]==false)
			{
				if(map[xx][yy][zz]=='.')
				{
					vis[xx][yy][zz]=true;
					a[tail].x=xx;
					a[tail].y=yy;
					a[tail].z=zz;
					a[tail].t=a[head].t+1;
					tail++;
				}
				if(map[xx][yy][zz]=='E')//到达目的地 
				{
					flag=1;
					ans=a[head].t+1;
					break;
				}
			}
		}
		if(flag==1)
		  break;
		head++;//对后面的点继续扩展 
	}
}
int main()
{
	int i,j,k;
	while(cin>>l>>r>>c)
	{
		if(l==0&&r==0&&c==0)
		  break;
		memset(vis,false,sizeof(vis));
		head=tail=ans=0; 
		a[tail].t=0;
		for(i=0;i<l;i++)
		   for(j=0;j<r;j++)
		      for(k=0;k<c;k++)
		      {
		      	  cin>>map[i][j][k];
		      	  if(map[i][j][k]=='S')//起点入队 
		      	  {
		      	  	  a[tail].x=i;
		      	  	  a[tail].y=j;
		      	  	  a[tail].z=k;
		      	  	  vis[i][j][k]=true;
		      	  	  tail++;
				  }
			  }
		flag=0;
		bfs();
		if(flag==1)
		   cout<<"Escaped in "<<ans<<" minute(s)."<<endl; 
		else
		   cout<<"Trapped!"<<endl; 
		
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43819762/article/details/108952588
今日推荐