地牢师父
时限:1000 MS 内存限制:65536K
提交材料共计: 23774 接受: 9248
描述
你被困在一个3D地牢,需要找到最快的出路!地牢由单位立方体组成,这些立方体可以填充岩石,也可以不填充岩石。向北、南、东、西、上或下移动一个单位需要一分钟。你不能对角移动,迷宫四周都是坚硬的岩石。
逃跑是可能的吗?如果是,需要多长时间?
输入
输入由若干地牢组成。每个地牢描述从包含三个整数L、R和C的一行开始(都限制在30个大小)。
我是组成地牢的等级数。
R和C是构成每个级别计划的行数和列数。
然后将跟随L个R行块,每一行都包含C字符。每个字符描述地牢的一个单元格。充满岩石的单元格由“#”表示,空单元格由“.”表示。你的起始位置用“S”表示,出口用字母“E”表示。在每个级别之后有一个空行。对于L、R和C,输入由三个零终止。
输出量
每个迷宫产生一行输出。如果可能到达出口,请打印表单的一行。
在x分钟内逃走了。
其中x被最短的逃逸时间所代替。
如果无法转义,请打印行
被困住了!
样本输入
3 4 5
S…
.###.
.##…
###.#
##.##
##…
#.###
####E
1 3 3
S##
#E#
0 0 0
样本输出
Escaped in 11 minute(s).
Trapped!
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct q
{
int x, y, z;
}q[30000];
int length[30000];
int xx[] = { 1,-1,0,0,0,0 };
int yy[] = { 0,0,0,0,-1,1 };
int zz[] = { 0,0,-1,1,0,0 };
bool dis[40][40][40];
char map[40][40][40];
int l, r, c, sx, sy, sz;
int bfs()
{
int rear, front, dx, dy, dz, i;
memset(dis, false, sizeof(dis));
memset(length, 0, sizeof(length));
q[0].x = sx;
q[0].y = sy;
q[0].z = sz;
front = rear = 0;
while (front <= rear)
{
for (i = 0; i<6; i++)
{
dx = q[front].x + xx[i];
dy = q[front].y + yy[i];
dz = q[front].z + zz[i];
if (!dis[dx][dy][dz] && (map[dx][dy][dz] == '.' || map[dx][dy][dz] == 'E') && dx >= 0 && dx<l && dy >= 0 && dy<r && dz >= 0 && dz<c)
{
dis[dx][dy][dz] = true;
q[++rear].x = dx;
q[rear].y = dy;
q[rear].z = dz;
length[rear] = length[front] + 1;
if (map[dx][dy][dz] == 'E') return length[rear];
}
}
front++;
}
return 0;
}
int main()
{
//freopen("input.txt", "r", stdin);
int i, j, k, key;
while (scanf("%d%d%d\n", &l, &r, &c))
{
if (l == 0 && r == 0 && c == 0)
break;
for (i = 0; i<l; i++, getchar())
for (j = 0; j<r; j++, getchar())
for (k = 0; k<c; k++)
{
scanf("%c", &map[i][j][k]);
if (map[i][j][k] == 'S') sx = i, sy = j, sz = k;
}
key = bfs();
if (key)
printf("Escaped in %d minute(s).\n", key);
else
printf("Trapped!\n");
}
return 0;
}