你被困在一个三维的空间中,现在要寻找最短路径逃生!空间由立方体单位构成,你每次向上下前后左右移动一个单位需要一分钟,你不能对角线移动并且四周封闭,是否存在逃出生天的可能性?如果存在,则需要多少时间?
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来解决问题。在程序中,还需要使用一个对列。在BFS搜索过程中,要对各个方向进行搜索。因为要求最短脱离时间,所以走过的位置不要再走。
代码如下:
#include"iostream"
#include"algorithm"
#include"cstring"
#include"queue"
using namespace std;
char a[32][32][32];
int l,c,r;
int dir[4][2]={0,1,0,-1,1,0,-1,0};
bool vst[32][32][32];
int cnt;
struct state
{
int i,j,k;
int cnt;//步数
};
bool cheak(state p)
{
if(p.k<0||p.j<0||p.i<0||p.i>=l||p.j>=c||p.k>=r||a[p.i][p.j][p.k]=='#'||vst[p.i][p.j][p.k])
{
return 0;
}
return 1;
}
void bfs(state p)
{
queue<state> q;
p.cnt=0;
vst[p.i][p.j][p.k]=1;//标记走过的位置
q.push(p);
state now,next;
while(!q.empty())//队列不为空
{
now=q.front();
if(a[now.i][now.j][now.k] =='E')
{
cout<<"Escaped in "<<now.cnt<<" minute(s)."<<endl;//输出最短脱离时间
return;
}
for(int i=0;i<4;i++)
{
next.i=now.i;
next.j=now.j+dir[i][0];
next.k=now.k+dir[i][1];
next.cnt=now.cnt+1;
if(cheak(next))
{
vst[next.i][next.j][next.k]=1;
q.push(next);
}
}
next.i=now.i+1;
next.j=now.j;
next.k=now.k;
next.cnt=now.cnt+1;
if(cheak(next))
{
vst[next.i][next.j][next.k]=1;
q.push(next);
}
next.i=now.i-1;
next.j=now.j;
next.k=now.k;
next.cnt=now.cnt+1;
if(cheak(next))
{
vst[next.i][next.j][next.k]=1;
q.push(next);
}
q.pop();
}
cout<<"Trapped!"<<endl;
}
int main()
{
while(cin>>l>>c>>r)
{
if(l==0)
{
break;
}
state b;
for(int i=0;i<l;i++)
{
for(int j=0;j<c;j++)
{
cin>>a[i][j];
for(int k=0;k<r;k++)
{
if(a[i][j][k]=='S')
{
b.i=i;
b.j=j;
b.k=k;
}
}
}
}
memset(vst,0,sizeof(vst));
bfs(b);
}
}