三维上的bfs,水题一发。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define INF 1000000
queue <int> q1,q2,q3;;
char Map[35][35][35];
int ans[35][35][35];
int flag1[35][35][35];
int L,R,C;
int pos1,pos2,pos3;
bool bfs(){
while(!q1.empty()){
int x=q1.front(),y=q2.front(),z=q3.front();
q1.pop(); q2.pop(); q3.pop();
if(Map[x][y][z]=='E'){
pos1=x;
pos2=y;
pos3=z;
break;
}
if(x+1<=L&&!flag1[x+1][y][z]&&(Map[x+1][y][z]=='.'||Map[x+1][y][z]=='E')){
flag1[x+1][y][z]=true;
ans[x+1][y][z]=ans[x][y][z]+1;
q1.push(x+1);
q2.push(y);
q3.push(z);
}
if(x-1>=1&&!flag1[x-1][y][z]&&(Map[x-1][y][z]=='.'||Map[x-1][y][z]=='E')){
flag1[x-1][y][z]=true;
ans[x-1][y][z]=ans[x][y][z]+1;
q1.push(x-1);
q2.push(y);
q3.push(z);
}
if(y+1<=R&&!flag1[x][y+1][z]&&(Map[x][y+1][z]=='.'||Map[x][y+1][z]=='E')){
flag1[x][y+1][z]=true;
ans[x][y+1][z]=ans[x][y][z]+1;
q1.push(x);
q2.push(y+1);
q3.push(z);
}
if(y-1>=1&&!flag1[x][y-1][z]&&(Map[x][y-1][z]=='.'||Map[x][y-1][z]=='E')){
flag1[x][y-1][z]=true;
ans[x][y-1][z]=ans[x][y][z]+1;
q1.push(x);
q2.push(y-1);
q3.push(z);
}
if(z+1<=C-1&&!flag1[x][y][z+1]&&(Map[x][y][z+1]=='.'||Map[x][y][z+1]=='E')){
flag1[x][y][z+1]=true;
ans[x][y][z+1]=ans[x][y][z]+1;
q1.push(x);
q2.push(y);
q3.push(z+1);
}
if(z-1>=0&&!flag1[x][y][z-1]&&(Map[x][y][z-1]=='.'||Map[x][y][z-1]=='E')){
flag1[x][y][z-1]=true;
ans[x][y][z-1]=ans[x][y][z]+1;
q1.push(x);
q2.push(y);
q3.push(z-1);
}
}
if(pos1==-1)
return false;
else
return true;
}
int main(){
while(cin>>L>>R>>C&&(L||R||C)){
bool flag;
pos1=pos2=pos3=-1;
memset(ans,0,sizeof(ans));
memset(Map,'\0',sizeof(Map));
memset(flag1,false,sizeof(flag1));
for(int i=1;i<=L;i++){
for(int j=1;j<=R;j++){
scanf("%s",Map[i][j]);
}
}
for(int i=1;i<=L;i++){
for(int j=1;j<=R;j++){
for(int k=0;k<C;k++){
if(Map[i][j][k]=='S'&&!flag1[i][j][k]){
flag1[i][j][k]=true;
q1.push(i);
q2.push(j);
q3.push(k);
flag=bfs();
break;
}
if(Map[i][j][k]=='E'){
pos1=i;
pos2=j;
pos3=k;
}
}
}
}
if(flag==false){
printf("Trapped!\n");
}
else{
printf("Escaped in %d minute(s).\n",ans[pos1][pos2][pos3]);
}
while(!q1.empty()){
q1.pop();
q2.pop();
q3.pop();
}
}
return 0;
}