Description
Input
Output
Escaped in x minute(s).
Trapped!
Sample Input
3 4 5 S.... .###. .##.. ###.# ##### ##### ##.## ##... ##### ##### #.### ####E 1 3 3 S## #E# ### 0 0 0
Sample Output
Escaped in 11 minute(s).Trapped!
一个3D迷宫,入口为S,出口为E,可以上下东西南北移动,每移动 一格,花费一秒,问从S~E最短时间;;
简单搜索,每次判断6个方向是否走,用数组d[][][]记录从S到d[i][j][k]的最短路径,输出d[Ei][Ej][Ek]就行了;;
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; const int inf=0x3f3f3f3f; char str[35][35][35]; int dx[6]={0,1,0,-1,0,0}; int dy[6]={1,0,-1,0,0,0}; int dz[6]={0,0,0,0,-1,1}; int n,m,z; int A,B,C; int d[35][35][35]; bool f(int lz,int lx,int ly) { if(lz>=0&&lz<z&&lx>=0&&lx<n&&ly>=0&&ly<m) return true; return false; } int dfs(int lz,int lx,int ly) { int nx,ny,nz; for(int i=0;i<6;i++) { nx=lx+dx[i]; ny=ly+dy[i]; nz=lz+dz[i]; if(f(nz,nx,ny)) { if(str[nz][nx][ny]!='#'&&d[nz][nx][ny]==inf) { d[nz][nx][ny]=d[lz][lx][ly]+1; dfs(nz,nx,ny); } } } return d[A][B][C]; } int main() { int a,b,c; while(~scanf("%d%d%d",&z,&n,&m)) { if(z==0&&n==0&&m==0) break; for(int i=0;i<z;i++) { for(int j=0;j<n;j++) { scanf("%s",str[i][j]); for(int k=0;k<m;k++) { d[i][j][k]=inf; if(str[i][j][k]=='S') a=i,b=j,c=k; if(str[i][j][k]=='E') A=i,B=j,C=k; } } } d[a][b][c]=0; int ans=dfs(a,b,c); if(ans==inf) printf("Trapped!\n"); else printf("Escaped in %d minute(s).\n",ans); } //cout << "Hello world!" << endl; return 0; }