分析
三维BFS即可,只能上下东西南北6个方向走。
注意不只是‘.’可以走‘E’也可以,就是保证不越界的情况下除了‘#’都可以走
vis忘memset wa了一发。
AC Code
#include<iostream>
#include<cstdio>
#include<queue>
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=30+5;
using namespace std;
int l,r,c;
int sz,sx,sy;
int dz[]={0,0,0,0,1,-1},dx[]={1,-1,0,0,0,0},dy[]={0,0,1,-1,0,0};
char mp[maxn][maxn][maxn];
bool vis[maxn][maxn][maxn];
struct node{
int x,y,z,level;
};
bool judge(node &tar){
if(mp[tar.z][tar.x][tar.y]=='E') return 1;
return 0;
}
bool ise(node &tar){
if(tar.z>=0&&tar.z<l&&tar.x>=0&&tar.x<r&&tar.y>=0&&tar.y<c) return 1;
return 0;
}
int bfs(){
queue<node> q;
node cur,next;
cur.z=sz;
cur.x=sx;
cur.y=sy;
cur.level=0;
memset(vis,0,sizeof(vis));
vis[cur.z][cur.x][cur.y]=1;
q.push(cur);
while(!q.empty()){
cur=q.front();
q.pop();
for(int i=0;i<6;i++){
next.z=cur.z+dz[i];
next.x=cur.x+dx[i];
next.y=cur.y+dy[i];
if(ise(next)&&mp[next.z][next.x][next.y]!='#'&&!vis[next.z][next.x][next.y]){
next.level=cur.level+1;
vis[next.z][next.x][next.y]=1;
q.push(next);
}
if(judge(next)){
return next.level;
}
}
}
return -1;
}
int main(){
while(~scanf("%d%d%d",&l,&r,&c)&&l+r+c){
for(int i=0;i<l;i++){
for(int j=0;j<r;j++){
scanf("%s",mp[i][j]);
for(int k=0;k<c;k++){
if(mp[i][j][k]=='S'){
sz=i;sx=j;sy=k;
}
}
}
}
int ans=bfs();
if(ans==-1)printf("Trapped!\n");
else printf("Escaped in %d minute(s).\n",ans);
}
return 0;
}