Dungeon Master(POJ-2251)
题目链接: https://vjudge.net/problem/POJ-2251#author=DeepSeek_zh
作者主页: https://blog.csdn.net/2401_89382924?spm=1011.2266.3001.5343
你被困在一个3D地牢中,需要找到最快的逃生路线!地牢由单位立方体组成,这些立方体可能填充岩石也可能为空。每次向北、南、东、西、上或下移动一个单位需要花费一分钟。不能斜向移动,且迷宫四周都被坚固的岩石包围。
有可能逃脱吗?如果有,需要多长时间?
输入
输入包含若干个地牢描述。每个地牢描述首行是三个整数L、R和C(均不超过30)。
L代表地牢的层数。
R和C代表每层的行数和列数。
随后是L个区块,每个区块包含R行,每行有C个字符。每个字符表示地牢的一个单元。岩石填充的单元用'#'表示,空单元用'.'表示。起始位置用'S'标记,出口用'E'标记。每个层级描述后有一个空行。当L、R和C均为0时输入终止。
输出
每个地牢对应一行输出。如果能够到达出口,输出格式为:
Escaped in x minute(s).
其中x替换为最短逃脱时间。
如果无法逃脱,则输出:
Trapped!
样例
输入
3 4 5
S....
.###.
.##..
###.######
#####
##.##
##...#####
#####
#.###
####E1 3 3
S##
#E#
###0 0 0
输出
Escaped in 11 minute(s).
Trapped!
代码
#include <stdio.h>
#include <string.h>#define MAXN 35
int que[MAXN * MAXN * MAXN][5];
int vis[MAXN][MAXN][MAXN];
char Map[MAXN][MAXN][MAXN];
int px[] = {0, 0, 1, -1, 0, 0};
int py[] = {1, -1, 0, 0, 0, 0};
int pz[] = {0, 0, 0, 0, 1, -1};
int l, r, c;
char GetChar(void)
{char ch;while ((ch = getchar()) == '\n' || ch == '\r') {}return ch;
}
int bfs(int sx, int sy, int sz, int lx, int ly, int lz)
{//printf("%d %d %d\n\n\n", l, r, c);int head = 0, tail = 1;que[0][1] = sx, que[0][2] = sy, que[0][3] = sz, que[0][4] = 1, vis[sx][sy][sz] = 1;while (head != tail){int fx = que[head][1], fy = que[head][2], fz = que[head][3], fstep = que[head][4];//putchar(Map[fx][fy][fz]);head++;for (int i = 0; i < 6; i++){int tx = fx + px[i], ty = fy + py[i], tz = fz + pz[i];if (tx < 0 || ty < 0 || tz < 0 || tx >= l || ty >= r || tz >= c) continue;if (Map[tx][ty][tz] == '#' || vis[tx][ty][tz] == 1) continue;//printf("%d %d %d\n", tx, ty, tz);que[tail][1] = tx, que[tail][2] = ty, que[tail][3] = tz, que[tail][4] = fstep + 1;vis[tx][ty][tz] = 1;tail++;if (tx == lx && ty == ly && tz == lz) // 到达终点return fstep;}}return -91;
}
int main()
{while (scanf("%d%d%d", &l, &r, &c) == 3 && l && r && c){int sx, sy, sz, lx, ly, lz;memset(que, 0, sizeof que);memset(Map, 0, sizeof Map);memset(vis, 0, sizeof vis);for (int i = 0; i < l; i++)for (int j = 0; j < r; j++)for (int k = 0; k < c; k++){Map[i][j][k] = GetChar(); // 输入字符if (Map[i][j][k] == 'S')sx = i, sy = j, sz = k;if (Map[i][j][k] == 'E')lx = i, ly = j, lz = k;}int ret = bfs(sx, sy, sz, lx, ly, lz);if (ret == -91)printf("Trapped!\n");elseprintf("Escaped in %d minute(s).\n", ret);}return 0;
}