地牢大师
您被困在 3D 地牢中,需要找到最快的出路!地牢由单位立方体组成,这些立方体可能充满也可能不充满岩石。向北、向南、向东、向西、向上或向下移动一个单位需要一分钟。你不能对角移动,迷宫四面都是坚固的岩石。
有没有可能逃脱?如果是,需要多长时间?
输入
输入由许多地牢组成。每个地牢描述都以一行包含三个整数 L、R 和 C(大小均限制为 30)开始。
L 是构成地牢的层数。
R 和 C 是构成每个级别的计划的行数和列数。
然后将跟随 L 块 R 行,每行包含 C 个字符。每个字符描述地牢的一个单元。装满岩石的单元格用“#”表示,空单元格用“.”表示。您的起始位置用“S”表示,出口用字母“E”表示。每个级别后都有一个空行。输入以 L、R 和 C 的三个零终止。
输出
每个迷宫产生一行输出。如果可以到达出口,打印一行表格
在 x 分钟内逃脱。
其中 x 替换为逃跑所需的最短时间。
如果无法逃脱,请打印该行
被困!
Sample Input
3 4 5
S…
.###.
.##…
###.#
##.##
##…
#.###
####E
1 3 3
S##
#E#
0 0 0
Sample Output
Escaped in 11 minute(s).
Trapped!
思路:就是普通的BFS求最短路径,只是这里要开三维数组和多一个dz的向上方的方向
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cstring>
#include<queue>
using namespace std;
int L,R,C,flag,time;
int ei=0,ej=0,ek=0;
char e[40][40][40];
int vist[40][40][40];
int dx[10]={0,-1,1,0,0,0,0};//三维方向
int dy[10]={0,0,0,1,-1,0,0};
int dz[10]={0,0,0,0,0,-1,1};
struct dian{
int x;
int y;
int z;
int step;//保存步数
};
bool check(int x,int y,int z)
{
if(vist[x][y][z]==1||x<1||x>L||y<1||y>R||z<1||z>C||e[x][y][z]=='#') return true;
else return false;
}
void bfs(int x,int y,int z)
{
vist[x][y][z]=1;
queue<dian> q;
q.push(dian{x,y,z,0});//起点压入队列里
while(!q.empty()){
dian node=q.front();
q.pop();
if(node.x==ei&&node.y==ej&&node.z==ek){//可以走到终点
flag=1;
time=node.step;//等于终点时,看看走了几步
return ;
}
for(int i=1;i<=6;i++){//从六个方向走
int newx=node.x+dx[i];
int newy=node.y+dy[i];
int newz=node.z+dz[i];
if(check(newx,newy,newz)) continue;//不符合就跳过
vist[newx][newy][newz]=1;//标记已经到达过
q.push(dian{newx,newy,newz,node.step+1});//压入新的点
}
}
}
int main()
{
int i,j,k;
int si,sj,sk;
while(cin>>L>>R>>C){
if(L==0||R==0||C==0) break;
memset(vist,0,sizeof(vist));
for(i=1;i<=L;i++){
for(j=1;j<=R;j++){
getchar();//吸收换行
for(k=1;k<=C;k++){
scanf("%c",&e[i][j][k]);
if(e[i][j][k]=='S'){//记录起点坐标
si=i,sj=j,sk=k;
}
if(e[i][j][k]=='E'){//记录终点坐标
ei=i,ej=j,ek=k;
}
}
}
getchar();//吸收换行
}
/*for(i=1;i<=L;i++){//输出地图,看看是否正确
for(j=1;j<=R;j++){
for(k=1;k<=C;k++){
printf("%c",e[i][j][k]);
}
printf("\n");
}
}*/
flag=0;
bfs(si,sj,sk);
if(flag){
printf("Escaped in %d minute(s).\n",time);
}
else printf("Trapped!\n");
}
}