题意介绍
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;
}