Week12_t2

题目描述
zjm被困在一个三维的空间中,现在要寻找最短路径逃生!
空间由立方体单位构成。
zjm每次向上下前后左右移动一个单位需要一分钟,且zjm不能对角线移动。
空间的四周封闭。zjm的目标是走到空间的出口。
是否存在逃出生天的可能性?如果存在,则需要多少时间?

输入格式
输入第一行是一个数表示空间的数量。
每个空间的描述的第一行为L,R和C(皆不超过30)。
L表示空间的高度,R和C分别表示每层空间的行与列的大小。
随后L层,每层R行,每行C个字符。
每个字符表示空间的一个单元。’#‘表示不可通过单元,’.‘表示空白单元。
zjm的起始位置在’S’,出口为’E’。每层空间后都有一个空行。
L,R和C均为0时输入结束。

输出格式
每个空间对应一行输出。
如果可以逃生,则输出如下
Escaped in x minute(s).
x为最短脱离时间。

如果无法逃生,则输出如下
Trapped!

输入样例

3 4 5
S….
.###.
.##..
###.#

#####
#####
##.##
##…

#####
#####
#.###
####E

1 3 3
S##
#E#
###

0 0 0

输出样例

Escaped in 11 minute(s).
Trapped!

解题思路
三维迷宫,容易让人想起二维迷宫。
实际上也确实和平面上的迷宫的解法一样,很好理解,甚至算法长得都一样,都是bfs。
需要注意的是这道题本身的特殊性:输入的每一行是连起来的,所以需要使用char数组来接着。

小小吐槽以下奇怪的oj,前后没改多少,时间消耗差距怎么会这么大呢
在这里插入图片描述

#include <queue>
#include <cstdio>

using namespace std;

int L, R, C;

const int dex[6][3] = { {-1,0,0},{1,0,0},{0,-1,0},{0,1,0},{0,0,1},{0,0,-1} };

char space[31][31][31];

int el, er, ec, sl, sr, sc;

int ans;

struct Point
{
	int x;
	int y;
	int z;
	int d;
};

void bfs(int x, int y, int z)
{
	queue<Point>q;
	Point t;
	t.x = x;
	t.y = y;
	t.z = z;
	t.d = 0;
	q.push(t);

	space[x][y][z] = '#';
	while (!q.empty())
	{
		int tx = q.front().x;
		int ty = q.front().y;
		int tz = q.front().z;
		for (int i = 0; i < 6; i++)
		{
			int hx = tx + dex[i][0];
			int hy = ty + dex[i][1];
			int hz = tz + dex[i][2];
			if (hx >= 0 && hx < L && hy >= 0 && hy < R && hz >= 0 && hz < C && space[hx][hy][hz] != '#')
			{
				if (space[hx][hy][hz] == 'E')
				{
					ans = q.front().d + 1;
					return;
				}
				Point temp;
				temp.d = q.front().d + 1;
				temp.x = hx;
				temp.y = hy;
				temp.z = hz;
				space[hx][hy][hz] = '#';
				q.push(temp);
			}
		}
		q.pop();
	}
	ans = -1;
}
int main()
{
	while (scanf("%d%d%d", &L, &R, &C))
	{
		if (L == 0 && R == 0 && C == 0)
		{
			break;
		}

		for (int i = 0; i < L; i++)
		{
			for (int j = 0; j < R; j++)
			{
				scanf("%s", space[i][j]);
				for (int k = 0; k < C; k++)
				{
					if (space[i][j][k] == 'S')
					{
						sl = i;
						sr = j;
						sc = k;
					}
					if (space[i][j][k] == 'E')
					{
						el = i;
						er = j;
						ec = k;
					}
				}
			}
		}
		bfs(sl, sr, sc);
		if (ans == -1)
			printf("Trapped!\n");
		else
			printf("Escaped in %d minute(s).\n", ans);
	}

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值