Description - 题目描述
[NWUACM]
你被困在一个三维的空间中,现在要寻找最短路径逃生!
空间由立方体单位构成
你每次向上下前后左右移动一个单位需要一分钟
你不能对角线移动并且四周封闭
是否存在逃出生天的可能性?如果存在,则需要多少时间?
Input - 输入
输入第一行是一个数表示空间的数量。
每个空间的描述的第一行为L,R和C(皆不超过30)。
L表示空间的高度。
R和C分别表示每层空间的行与列的大小。
随后L层地牢,每层R行,每行C个字符。
每个字符表示空间的一个单元。'#'表示不可通过单元,'.'表示空白单元。你的起始位置在'S',出口为'E'。
每层空间后都有一个空行。L,R和C均为0时输入结束。
Output - 输出
每个空间对应一行输出。
如果可以逃生,则输出如下
Escaped in x minute(s).
x为最短脱离时间。
如果无法逃生,则输出如下
Trapped!
Sample Input - 输入样例
3 4 5 S.... .###. .##.. ###.# ##### ##### ##.## ##... ##### ##### #.### ####E 1 3 3 S## #E# ### 0 0 0
Sample Output - 输出样例
Escaped in 11 minute(s). Trapped!
大致思路:这道题和一般的BFS板子题不同的地方就是,搜索空间是三维的,定义方向数组时要考虑到方向向上和向下和不动三种情况。同时储存图时可以用三维数组来存图。
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
const int MAXN=30+10;
char mp[MAXN][MAXN][MAXN];
int vis[MAXN][MAXN][MAXN];
struct node{
int level,x,y,step;//level记录层数
bool friend operator <(node a,node b){
return a.step>b.step;
}
};
int L,R,C,sx,sy,sle,ex,ey,ele;
int up[6]={1,-1,0,0,0,0},dx[6]={0,0,1,0,-1,0},dy[6]={0,0,0,-1,0,1};//方向数组
void BFS(){
priority_queue<node> qu;
memset(vis,0,sizeof(vis));
node e1;
e1.level=sle,e1.x=sx,e1.y=sy,e1.step=0;
vis[e1.level][e1.x][e1.y]=1;
qu.push(e1);
int ans=-1;
while(!qu.empty()){
node e2;
e1=qu.top();qu.pop();
if(e1.level==ele&&e1.x==ex&&e1.y==ey){
ans=e1.step;
break;
}
for(int i=0;i<6;i++){
e2.level=e1.level+up[i];
e2.x=e1.x+dx[i];
e2.y=e1.y+dy[i];
if(vis[e2.level][e2.x][e2.y]) continue;
if(e2.level<0||e2.level>=L) continue;
if(e1.x<0||e1.x>R) continue;
if(e1.y<0||e1.y>C) continue;
if(mp[e2.level][e2.x][e2.y]=='#') continue;
if(mp[e2.level][e2.x][e2.y]=='.'||mp[e2.level][e2.x][e2.y]=='E'){
e2.step=e1.step+1;
vis[e2.level][e2.x][e2.y]=1;
qu.push(e2);
}
}
}
if(ans==-1) printf("Trapped!\n");
else printf("Escaped in %d minute(s).\n",ans);
}
int main(){
while(~scanf("%d%d%d",&L,&R,&C)&&(L+R+C)){
//getchar();//吸收空格
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'){ sle=i;sx=j;sy=k;}
if(mp[i][j][k]=='E'){ ele=i;ex=j;ey=k;}
}
}
//getchar();
}
BFS();
}
return 0;
}