您的位置:首页 > 其它

UVA532 Dungeon Master

2016-08-07 20:22 295 查看
问题链接:UVA532 Dungeon Master

题意简述:三维空间地牢(迷宫),每个点由'.'(可以经过)、'#'(墙)、'S'(起点)和'E'(终点)组成。移动方向有上、下、左、右、前和后6个方向。每移动一次耗费1分钟,求从'S'到'E'最快走出时间。不同L层,相同RC处是连通的。

问题分析:一个三维迷宫,典型的BFS问题。在BFS搜索过程中,走过的点就不必再走了,因为这次再走下去不可能比上次的步数少。

程序中,使用了一个队列来存放中间节点,但是每次用完需要清空。需要注意的一点,为了编程方便,终点'E'置为'.'。

需要说明的一点,用C++语言的输入比起C语言的输入,程序简洁方便。

AC的C++语言程序如下:

/* UVA532 Dungeon Master */

#include <iostream>
#include <queue>

using namespace std;

const int DIRECTSIZE = 6;
struct direct {
int dx;
int dy;
int dz;
} direct[DIRECTSIZE] =
{{-1, 0, 0}, {1, 0, 0}, {0, -1, 0}, {0, 1, 0}, {0, 0, -1}, {0, 0, 1}};

const int MAXN = 50;
char cube[MAXN][MAXN][MAXN];

struct node {
int x, y, z, level;
};

int L, R, C;
node start, e2;
int ans;

void bfs()
{
queue<node> q;

ans = -1;
q.push(start);

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

if(front.x == e2.x && front.y == e2.y && front.z == e2.z) {
ans = front.level;
break;
}

for(int i=0; i<DIRECTSIZE; i++) {
int nextx, nexty, nextz;

nextx = front.x + direct[i].dx;
if(0 > nextx || nextx >= L)
continue;
nexty = front.y + direct[i].dy;
if(0 > nexty || nexty >= R)
continue;
nextz = front.z + direct[i].dz;
if(0 > nextz || nextz >= C)
continue;

if(cube[nextx][nexty][nextz] == '.') {
cube[nextx][nexty][nextz] = '#';

node v;
v.x = nextx;
v.y = nexty;
v.z = nextz;
v.level = front.level + 1;
q.push(v);
}
}
}
}

int main()
{
int i, j, k;
char c;

while(cin >> L >> R >> C) {
if(L == 0 && R == 0 && C == 0)
break;

for(i=0; i<L; i++) {
for(j=0; j<R; j++) {
for(k=0; k<C; k++) {
cin >> c;

cube[i][j][k] = c;
if(c == 'S') {
start.x = i;
start.y = j;
start.z = k;
start.level = 0;
} else if(c == 'E') {
e2.x = i;
e2.y = j;
e2.z = k;
cube[i][j][k] = '.';
}
}
}
}

bfs();

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

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: