这又是一道bfs的题。有一个给定长、宽、高的三维迷宫,给定起点与终点,每走一步花费1分钟,若可以出去则输出最短时间,否则输出“Trapped!”。其中起点为‘S’,终点为‘E’,墙为‘#’,路为‘.’。
直接bfs,没什么好说的。
#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;
typedef struct Way{
int x,y,z;
int step;
}Way;
bool Dung[35][35][35]={0};
queue <Way> g;
int main(){
int L,R,C;
while(scanf("%d%d%d",&L,&R,&C) && L+R+C!=0){
memset(Dung,0,sizeof(Dung));
int eI,eJ,eK;
bool flag=0;
Way a,b;
for(int i=0;i<L;i++){
for(int j=0;j<R;j++){
for(int k=0;k<C;k++){
char cell;
cin>>cell;
if(cell=='#') Dung[i][j][k]=1;
else if(cell=='S'){
Dung[i][j][k]=1;
a.x=i;a.y=j;a.z=k;a.step=0;
}
else if(cell=='E'){
eI=i;eJ=j;eK=k;
}
}
}
}
g.push(a);
while(!g.empty()){
a=g.front();g.pop();
if(a.x==eI && a.y==eJ && a.z==eK){
flag=1;break;
}
if(a.x+1<L && !Dung[a.x+1][a.y][a.z]){
b.x=a.x+1;b.y=a.y;b.z=a.z;b.step=a.step+1;
Dung[a.x+1][a.y][a.z]=1;
g.push(b);
}
if(a.x-1>=0 && !Dung[a.x-1][a.y][a.z]){
b.x=a.x-1;b.y=a.y;b.z=a.z;b.step=a.step+1;
Dung[a.x-1][a.y][a.z]=1;
g.push(b);
}
if(a.y+1<R && !Dung[a.x][a.y+1][a.z]){
b.x=a.x;b.y=a.y+1;b.z=a.z;b.step=a.step+1;
Dung[a.x][a.y+1][a.z]=1;
g.push(b);
}
if(a.y-1>=0 && !Dung[a.x][a.y-1][a.z]){
b.x=a.x;b.y=a.y-1;b.z=a.z;b.step=a.step+1;
Dung[a.x][a.y-1][a.z]=1;
g.push(b);
}
if(a.z+1<C && !Dung[a.x][a.y][a.z+1]){
b.x=a.x;b.y=a.y;b.z=a.z+1;b.step=a.step+1;
Dung[a.x][a.y][a.z+1]=1;
g.push(b);
}
if(a.z-1>=0 && !Dung[a.x][a.y][a.z-1]){
b.x=a.x;b.y=a.y;b.z=a.z-1;b.step=a.step+1;
Dung[a.x][a.y][a.z-1]=1;
g.push(b);
}
}
if(flag){
printf("Escaped in %d minute(s).\n",a.step);
}
else cout<<"Trapped!"<<endl;
for(;!g.empty();g.pop());
}
return 0;
}