Description - 题目描述
[NWUACM]
你被困在一个三维的空间中,现在要寻找最短路径逃生!
空间由立方体单位构成
你每次向上下前后左右移动一个单位需要一分钟
你不能对角线移动并且四周封闭
是否存在逃出生天的可能性?如果存在,则需要多少时间?
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<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int L,m,n,a[35][35][35],dir[6][3]={{0,0,1},{0,1,0},{0,0,-1},{0,-1,0},{1,0,0},{-1,0,0}};
char str[35][35][35];
struct node{
int x,y,z,step;
};
int bfs(int sx,int sy,int sz,int ex,int ey,int ez){
queue<node>p;
node fr,nr;
fr.x=sx;fr.y=sy;fr.z=sz;fr.step=0;
a[sx][sy][sz]=1;
p.push(fr);
while(!p.empty()){
fr=p.front();
p.pop();
if((fr.x==ex)&&(fr.y==ey)&&(fr.z==ez)){
return fr.step;
}
for(int i=0;i<6;i++){
nr.x=fr.x+dir[i][0];
nr.y=fr.y+dir[i][1];
nr.z=fr.z+dir[i][2];
if((str[nr.x][nr.y][nr.z]!='#')&&(nr.x>=0&&nr.x<L)&&(nr.y>=0&&nr.y<m)&&(nr.z>=0&&nr.z<n)&&(a[nr.x][nr.y][nr.z]==0)){
nr.step=fr.step+1;
a[nr.x][nr.y][nr.z]=1;
p.push(nr);
}
}
}
return -1;
}
int main(){
int sx,sy,sz,ex,ey,ez;
while(scanf("%d%d%d",&L,&m,&n)!=EOF){
if(L==0&&m==0&&n==0)
break;
memset(a,0,sizeof(a));
memset(str,'0',sizeof(str));
for(int i=0;i<L;i++){
for(int j=0;j<m;j++){
scanf("%s",&str[i][j]);
for(int k=0;k<n;k++){
if(str[i][j][k]=='S'){
sx=i;sy=j;sz=k;
}
if(str[i][j][k]=='E'){
ex=i;ey=j;ez=k;
}
}
}
}
int t=bfs(sx,sy,sz,ex,ey,ez);
if(t==-1){
printf("Trapped!\n");
}
else
printf("Escaped in %d minute(s).\n",t);
}
return 0;
}