你被困在一个三维的空间中,现在要寻找最短路径逃生!
空间由立方体单位构成
你每次向上下前后左右移动一个单位需要一分钟
你不能对角线移动并且四周封闭
是否存在逃出生天的可能性?如果存在,则需要多少时间?
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!
这道题我真的是提交了无数遍,后来才发现分别把那个限定范围改成1到长宽高就可以了,这里是一定要注意的。
代码如下:
#include"iostream"
#include"cstring"
#include"algorithm"
#include"queue"
using namespace std;
struct cmp
{
int x,y,z;
int sum;
};
int vst[35][35][35];
char pic[35][35][35];
int dic[6][3]={1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1};
int n,m,l;
int xx,yy,zz;
void dfs()
{
queue<cmp> q;
cmp r;
r.x=xx;
r.y=yy;
r.z=zz;
r.sum=0;
vst[xx][yy][zz]=1;
q.push(r);
while(!q.empty())
{
cmp e=q.front();
q.pop();
int xxx=e.x;
int yyy=e.y;
int zzz=e.z;
int Sum=e.sum;
if(pic[xxx][yyy][zzz]=='E')
{
cout<<"Escaped in "<<Sum<<" minute(s)."<<endl;
return;
}
for(int i = 0;i < 6;i ++)
{
cmp h;
int cx=h.x=dic[i][0]+xxx;
int cy=h.y=dic[i][1]+yyy;
int cz=h.z=dic[i][2]+zzz;
h.sum=Sum+1;
if(cx < 1 || cy < 1 || cz < 1 || cx > n || cy > m || cz > l)
{
continue;
}
if(pic[cx][cy][cz] != '#' && !vst[cx][cy][cz])
{
vst[cx][cy][cz]=1;
q.push(h);
}
}
}
cout<<"Trapped!"<<endl;
}
int main()
{
while(cin >> n >> m >> l && (n && m && l))
{
for(int j = 1;j <= n;j ++)
{
for(int i = 1;i <= m;i ++)
{
for(int k = 1;k <= l;k ++)
{
cin >> pic[j][i][k];
if(pic[j][i][k] == 'S')
{
xx=j;
yy=i;
zz=k;
}
}
}
}
memset(vst,0,sizeof(vst));
dfs();
}
return 0;
}