题目链接
题目大意:
三维的空间,起始位置是 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;
}