1253:Dungeon Master(地牢大师、底下城主)
要敢于变通
和普通bfs的区别,仅仅在于数组开三维+搜索方向多了上下(现在的搜索方向是 上下东南西北)
bfs多组输入要记得清空队列
//#include <bits/stdc++.h>
#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
const int N=35;
int l,m,n;
//int sx,sy,sz;//起点直接入队
int ex,ey,ez;
char a[N][N][N];
int vis[N][N][N];
int dx[6]={0,0,1,-1,0,0};
int dy[6]={1,-1,0,0,0,0};
int dz[6]={0,0,0,0,1,-1};//东西南北上下
bool inside(int cx,int cy,int cz){
return cx>=0&&cx<l&&cy>=0&&cy<m&&cz>=0&&cz<n;
} //TT,按照xyz的顺序来的,x指的才是z轴上的值,看a数组的输入
struct node{
int x,y,z;
int step;//步数
};
queue<node> Q;
int res;
void bfs(){
while(!Q.empty()){
node t=Q.front();Q.pop();
int x=t.x;
int y=t.y;
int z=t.z;
int s=t.step;
if(x==ex&&y==ey&&z==ez){
// cout<<s<<endl;
res=s;
return;
}
for(int i=0;i<6;i++){
int cx=x+dx[i];
int cy=y+dy[i];
int cz=z+dz[i];
if(inside(cx,cy,cz)&&!vis[cx][cy][cz]&&a[cx][cy][cz]!='#'){
vis[cx][cy][cz]=1;
Q.push({cx,cy,cz,s+1});
}
}
}
}
signed main(){
ios::sync_with_stdio(false);
// cin.tie(0);
while(cin>>l>>m>>n){
if(!l&&!m&&!n)break;
memset(vis,0,sizeof(vis));
res=-1;
while(!Q.empty()){//bfs多组输入要记得清空队列
Q.pop();
}
for(int i=0;i<l;i++){
for(int j=0;j<m;j++){
for(int k=0;k<n;k++){
cin>>a[i][j][k];
if(a[i][j][k]=='S'){
vis[i][j][k]=1;
Q.push({i,j,k,0});
}
if(a[i][j][k]=='E'){
ex=i,ey=j,ez=k;
}
}
}
// getchar();//加上反而0分wa???
}
bfs();
if(res==-1)cout<<"Trapped!"<<endl;
else cout<<"Escaped in "<<res<<" minute(s)."<<endl;
}
return 0;
}