题意: 给一个立体的迷宫,问能否走出来,能的话输出最短时间。
题解:一个三维的迷宫, 走的方向无非和二维差别就是多了上下两个方向,直接广搜跑一边就行了。
//#include<bits/stdc++.h>
#include<queue>
#include<stdio.h>
#include<string.h>
#define LL long long
using namespace std;
const int maxn=30+5;
int l,r,c,ex,ey,ez,sx,sy,sz;
char mapp[maxn][maxn][maxn];
int vis[maxn][maxn][maxn];
int dir[6][3]={{0,1,0},{0,0,1},{0,-1,0},{0,0,-1},{1,0,0},{-1,0,0}};
struct node{
int x,y,z;
int step;
};
int judge(int x,int y,int z){
if(x<1||y<1||z<1||x>l||y>r||z>c)
return 0;
if(mapp[x][y][z]=='#'||vis[x][y][z]==1)
return 0;
return 1;
}
int bfs(int x,int y,int z){
queue<node> que;
node u,v;
vis[x][y][z]=1;
v.x=x,v.y=y,v.z=z,v.step=0;
que.push(v);
while(!que.empty()){
v=que.front();
que.pop();
for(int i=0;i<6;i++){
u.x=v.x+dir[i][0];
u.y=v.y+dir[i][1];
u.z=v.z+dir[i][2];
if(judge(u.x,u.y,u.z)){
u.step=v.step+1;
que.push(u);
vis[u.x][u.y][u.z]=1;
}
}
if(v.x==ex&&v.y==ey&&v.z==ez)
return v.step;
}
return 0;
}
int main()
{
while(scanf("%d%d%d",&l,&r,&c)&&(l&&r&&c)){
memset(vis,-1,sizeof(vis));
for(int i=1;i<=l;i++){
for(int j=1;j<=r;j++){
getchar();
for(int k=1;k<=c;k++){
scanf("%c",&mapp[i][j][k]);
if(mapp[i][j][k]=='S') sx=i,sy=j,sz=k;
if(mapp[i][j][k]=='E') ex=i,ey=j,ez=k;
}
}
getchar();
}
int ans=bfs(sx,sy,sz);
if(ans==0) printf("Trapped!\n");
else printf("Escaped in %d minute(s).\n",ans);
}
return 0;
}