B - 必做题 - 2

题意介绍

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

题意分析

用到了bfs,不能逃出的情况有两种,一是由于障碍物到达不了出口,二是在规定时间内到达不了出口,两种都要考虑到

通过代码

#include<iostream>
#include<queue>

using namespace std;

struct node {
	int x, y, z;

	node(){}

	node(int xx, int yy, int zz) {
		x = xx;
		y = yy;
		z = zz;
	}
};

int X[6] = { 1,-1,0,0,0,0 };
int Y[6] = { 0,0,1,-1,0,0 };
int Z[6] = { 0,0,0,0,1,-1 };

int vis[30][30][30], dis[30][30][30];
int sx, sy, sz, tx, ty, tz;
queue<node> q;
int l, r, c;
char ch;


void init() {
	for (int i = 0; i < 30; i++) {
		for (int j = 0; j < 30; j++) {
			for (int k = 0; k < 30; k++) {
				vis[i][j][k] = 0;
				dis[i][j][k] = 0;
			}
		}
	}
}

int bfs() {
	while (!q.empty()) q.pop();

	q.push(node(sx, sy, sz));
	vis[sz][sx][sy] = 1;
	dis[sz][sx][sy] = 0;

	while (!q.empty()) {
		node now = q.front();
		q.pop();

		for (int i = 0; i < 6; i++) {
			int x = now.x + X[i];
			int y = now.y + Y[i];
			int z = now.z + Z[i];

			if (x >= 0 && x < r&&y >= 0 && y < c&&z >= 0 && z < l && !vis[z][x][y]) {
				dis[z][x][y] = dis[now.z][now.x][now.y] + 1;
				vis[z][x][y] = 1;
				q.push(node(x, y, z));
			}
		}
	}
	if (dis[tz][tx][ty] == 0) return -1;
	else return dis[tz][tx][ty];
}
int main() {
	while ((cin >> l >> r >> c)&&(l!=0 && r!=0 && c!=0)) {
		init();
		for (int i = 0; i < l; i++) {
			for (int j = 0; j < r; j++) {
				for (int k = 0; k < c; k++) {
					cin >> ch;
					if (ch == '#') vis[i][j][k] = 1;
					else if (ch == '.') vis[i][j][k] = 0;
					else if (ch == 'S') {
						sz = i;
						sx = j;
						sy = k;
					}
					else if (ch == 'E') {
						tz = i;
						tx = j;
						ty = k;
					}
				}
			}
		}
		int ans=bfs();
		if (ans == -1) cout << "Trapped!" << endl;
		else cout << "Escaped in " << ans << " minute(s)." << endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值