问题链接:。
题意简述:三维空间地牢(迷宫),每个点由'.'(可以经过)、'#'(墙)、'S'(起点)和'E'(终点)组成。移动方向有上、下、左、右、前和后6个方向。每移动一次耗费1分钟,求从'S'到'E'最快走出时间。不同L层,相同RC处是连通的。
问题分析:一个三维迷宫,典型的BFS问题。在BFS搜索过程中,走过的点就不必再走了,因为这次再走下去不可能比上次的步数少。
程序中,使用了一个队列来存放中间节点,但是每次用完需要清空。需要注意的一点,为了编程方便,终点'E'置为'.'。
需要说明的一点,用C++语言的输入比起C语言的输入,程序简洁方便。
AC的C++语言程序如下:
/* UVA532 Dungeon Master */#include#include 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 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 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 > 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;}