[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!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | #include <iostream> #include<cstdio> #include<algorithm> #include<queue> #include<cstring> #include<string> using namespace std; const int MAXN=32; char s[MAXN][MAXN][MAXN]; int vis[MAXN][MAXN][MAXN]; int d[6][3]={0,0,1,0,0,-1,-1,0,0,1,0,0,0,1,0,0,-1,0}; int l,r,c; struct node { int x,y,z; int step; friend bool operator < (node a,node b) { return a.step>b.step; } }; void bfs(int sz,int sx,int sy,int ez,int ex,int ey) { node e1,e2; vis[sz][sx][sy]=0; e1.z=sz,e1.x=sx,e1.y=sy,e1.step=0; priority_queue<node> que; que.push(e1); int res=-1; while(que.size()){ e1=que.top();que.pop(); if(e1.z==ez&&e1.x==ex&&e1.y==ey){ res=e1.step;break; } for(int i=0;i<6;i++){ e2.z=e1.z+d[i][0],e2.x=e1.x+d[i][1],e2.y=e1.y+d[i][2]; if(e2.z>=0&&e2.z<l&&e2.x>=0&&e2.x<r&&e2.y>=0&&e2.y<c &&s[e2.z][e2.x][e2.y]!='#'&&vis[e2.z][e2.x][e2.y]){ e2.step=e1.step+1; vis[e2.z][e2.x][e2.y]=0; que.push(e2); } } } if(res==-1)printf("Trapped!\n"); else printf("Escaped in %d minute(s).\n",res); } int main() { int sx,sy,sz,ex,ey,ez,i,j,k; while(scanf("%d%d%d",&l,&r,&c)==3){ if(l==0&&r==0&&c==0)break; memset(vis,1,sizeof(vis)); for(i=0;i<l;i++) for(j=0;j<r;j++) scanf("%s",s[i][j]); for(i=0;i<l;i++) for(j=0;j<r;j++) for(k=0;k<c;k++){ if(s[i][j][k]=='S') sz=i,sx=j,sy=k; if(s[i][j][k]=='E') ez=i,ex=j,ey=k; } bfs(sz,sx,sy,ez,ex,ey); } return 0; } |