【三维 + BFS】POJ 2251 Dungeon Master

这段时间要沉迷刷题一段时间了,就让CSDN陪我一起吧!

一、题目大意

这道题目的意思是在一个地牢里走迷宫,地牢一共L层,每一层都用一个R×C的矩阵来表示,其中’#‘表示墙,’.‘表示空地,‘S’表示开始的地方,‘E’表示结束的地方。要求是否可以从’S’走到’E’,如果不可以则输出’Trapped!’,否则输出’Escaped in x minute(s).’,其中x是能出来的最短时间(步数)。

二、题目思路以及AC代码

这道题就没有什么特别的,无非是将bfs稍微变了一下而已,变成了在三维上移动,本质还是一样的。做法就还是bfs的做法。

但这里面有一个坑必须得说一下。就是输出的时候,Escaped in x minute(s). 这里不是要你根据x的值来变单复数,而是无论x取值为多少,这里都是括号s!!这里要注意,我因为这里有一次WA。

下面给出AC代码:

#include <iostream>
#include <queue>
#define MAXN 35
using namespace std;

struct Point {
	int x, y, z;
	int step;
};

int L, R, C;
Point start, finish;

// 可以走的方向
int dx[6] = { -1, 0, 1, 0, 0, 0 };
int dy[6] = { 0, 0, 0, -1, 0, 1 };
int dz[6] = { 0, -1, 0, 0, 1, 0 };

// 前两维是当前平面,后一维是层数
char map[MAXN][MAXN][MAXN];
bool vis[MAXN][MAXN][MAXN];

int bfs() {
	for (int i = 0; i < MAXN; i++) {
		for (int j = 0; j < MAXN; j++) {
			for (int k = 0; k < MAXN; k++) {
				vis[i][j][k] = false;
			}
		}
	}

	queue<Point> q;
	q.push(start);
	vis[start.x][start.y][start.z] = true;

	while (!q.empty()) {
		Point cur = q.front();	 q.pop();
		
		for (int i = 0; i < 6; i++) {
			int nx = cur.x + dx[i];
			int ny = cur.y + dy[i];
			int nz = cur.z + dz[i];

			if (nx < 0 || nx >= R || ny < 0 || ny >= C || nz < 0 || nz >= L) continue;
			if (map[nx][ny][nz] == '#' || vis[nx][ny][nz]) continue;

			if (nx == finish.x && ny == finish.y && nz == finish.z)
				return cur.step + 1;

			vis[nx][ny][nz] = true;
			Point next;
			next.x = nx;
			next.y = ny;
			next.z = nz;
			next.step = cur.step + 1;
			q.push(next);
		}
	}

	return -1;
}

int main()
{
	while (cin >> L >> R >> C) {
		
		if (!L && !R && !C)
			break;

		for (int k = 0; k < L; k++) {
			for (int i = 0; i < R; i++) {
				for (int j = 0; j < C; j++) {
					cin >> map[i][j][k];
					if (map[i][j][k] == 'S') {
						start.x = i;
						start.y = j;
						start.z = k;
					}
					if (map[i][j][k] == 'E') {
						finish.x = i;
						finish.y = j;
						finish.z = k;
					}
				}
			}
		}
		
		start.step = 0;
		int ans = bfs();

		if (ans == -1)
			cout << "Trapped!" << endl;
		else
			cout << "Escaped in " << ans << " minute(s)." << endl;
	}

    return 0;
}

如果有问题,欢迎大家指正!!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值