Dungeon Master
你被困在一个3D地牢中且继续寻找最短路径逃生!地牢由立方体单位构成,立方体中不定会充满岩石。向上下前后左右移动一个单位需要一分钟。你不能对角线移动并且迷宫四周坚石环绕。
是否存在逃出生天的可能性?如果存在,则需要多少时间?
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!
模版题
代码
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
#define LL long long
#define M 50
int to[][3]={0,-1,0,0,1,0,0,0,1,0,0,-1,-1,0,0,1,0,0};
struct dot
{
int v,x,y,step;
};
int mp[M][M][M];
void bfs(dot st,dot ed)
{
int i,j;
queue<dot>Q;
int flag=0;
dot now,next;
st.step=0;
mp[st.v][st.x][st.y]=0;
Q.push(st);
while(!Q.empty())
{
now=Q.front();Q.pop();
if(now.v==ed.v&&now.x==ed.x&&now.y==ed.y)
{
flag=1;
break;
}
for(i=0;i<6;i++)
{
next.x=now.x+to[i][1];
next.v=now.v+to[i][0];
next.y=now.y+to[i][2];
if(mp[next.v][next.x][next.y]==1) // 这里可以省事,整个地图都用 1 表示可走,0 表示 不可走,不用VIS 标记数组
{
next.step=now.step+1;
mp[next.v][next.x][next.y]=0;
Q.push(next);
}
}
}
if(flag) printf("Escaped in %d minute(s).\n",now.step);
else printf("Trapped!\n");
}
int main()
{
int v,n,m;
dot st,ed;
while(~scanf("%d%d%d",&v,&n,&m)&&(v||n||m))
{
memset(mp,0,sizeof(mp));
int i,j,k;
for(i=1;i<=v;i++)
{
for(j=1;j<=n;j++)
{
getchar();
for(k=1;k<=m;k++)
{
char c;
scanf("%c",&c);
if(c=='S')
{
st.x=j;
st.v=i;
st.y=k;
mp[i][j][k]=1;
}
else if(c=='E')
{
ed.x=j;
ed.v=i;
ed.y=k;
mp[i][j][k]=1;
}
else if(c=='.') mp[i][j][k]=1;
}
}
getchar();
}
bfs(st,ed);
}
return 0;
}