你被困在一个3D地牢中且继续寻找最短路径逃生!地牢由立方体单位构成,立方体单位中有的会充满岩石。向上下前后左右移动一个单位需要一分钟。你不能向对角线的四个方向移动且迷宫四周环绕着许多岩石。
是否可以逃出地牢?如果可以,则需要多少时间?
Input - 输入
输入的第一行包含一个数,表示地牢的数量。
每个地牢的描述,其第一行包含三个数L,R和C(均小于等于30)。
L表示地牢的层数;R和C分别表示每层地牢的行与列的大小。
随后输入地牢的层数L,每层中包含R行,每行中包含C个字符。
每个字符表示地牢的一个单元。'#'表示岩石单元,'.'表示空白单元。你的起始位置在点'S',出口为'E'。
每层地牢的输入后都有一个空行。当L,R和C均为0时,输入结束。
Output - 输出
每个迷宫对应一行输出。
如果可以逃生,则输出如下
Escaped in x minute(s).
x为最短脱离时间。
如果无法逃生,则输出如下
Trapped!
Sample Input - 输入样例
3 4 5 S.... .###. .##.. ###.# ##### ##### ##.## ##... ##### ##### #.### ####E 1 3 3 S## #E# ### 0 0 0
Sample Output - 输出样例
Escaped in 11 minute(s). Trapped
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
struct Node
{
int x, y, z, step;
Node(int xx, int yy,int zz , int sstep) : x(xx),y(yy),z(zz),step(sstep){}
};
int xend, yend, zend,z1,y1,x1;
const int d[6][3]={{0, 0, 1},{0, 1, 0}, {1, 0, 0}, {-1,0,0},{0,-1,0},{0,0,-1}};
char a[52][52][52]; int book[52][52][52];
int bfs(int x, int y, int z, int step)
{
queue<Node>A;
A.push(Node(x, y, z, step));
book[x][y][z] = 1 ;
while(!A.empty())
{
Node u = A.front();
A.pop();
if(u.x == xend && u.y == yend && u.z == zend)
{
return u.step;
}
for(int i = 0;i < 6 ;i++)
{
int xx = u.x+d[i][0];
int yy = u.y+d[i][1];
int zz = u.z+d[i][2];
int ss = u.step + 1 ;
if(xx < 0 || xx > x1 || yy < 0 || yy > y1 || zz < 0 || zz > z1)
{
continue;
}
if(a[xx][yy][zz] == '.' && book[xx][yy][zz] == 0)
{
book[xx][yy][zz] = 1;
A.push(Node(xx,yy,zz,ss));
}
}
}
return -1;
}
int main()
{
int xstart, ystart , zstart;
while(1)
{
memset(a,0,sizeof(a));
memset(book,0,sizeof(book));
scanf("%d%d%d",&x1,&y1,&z1);
if(!(x1 && y1 && z1))
{
return 0;
}
for(int i = 1;i <= x1;i++)
{
for(int j = 1;j <= y1;j++)
{
for(int v = 1;v <= z1;v++)
{
cin>>a[i][j][v];
if(a[i][j][v] == 'S')
{
xstart = i;
ystart = j;
zstart = v;
}
if(a[i][j][v] == 'E')
{
xend = i;
yend = j;
zend = v;
a[xend][yend][zend] = '.';
}
}
}
}
a[xstart][ystart][zstart] = '#';
int u=bfs(xstart, ystart, zstart,0);
if(u == -1)
{
printf("Trapped!\n");
}
else{
printf("Escaped in %d minute(s).\n",u);
}
}
return 0;
}