题目链接:Dungeon Master
解题思路:从二维转化成了三维,用BFS,注意图的录入方式。(用STL的队列实现)
#include<stdio.h>
#include<string.h>
#include<queue>
#define MAX 35
using namespace std;
struct A{
int x, y, z, time;
};
typedef struct A node;
char map[MAX][MAX][MAX];
int v[MAX][MAX][MAX];
const int dir[6][3] = {0, 1, 0, 0, -1, 0, 0, 0, 1, 0, 0, -1, 1, 0, 0, -1, 0, 0};
int l, r, c, ans;
int sx, sy, sz, ex, ey, ez;
int judge(int x, int y, int z){
if(map[z][x][y] == '#' || v[z][x][y] || z <= 0 || x <= 0 || y <= 0 || z > l || x > r || y > c){
return 0;
}
return 1;
}
int BFS(){
queue<node> my;
node s, tem;
int i;
tem.x = sx;tem.y = sy;tem.z = sz;tem.time = 0;
v[sz][sx][sy] = 1;
my.push(tem);
while(!my.empty()){
s = my.front();
my.pop();
for(i = 0; i < 6; i++){
int z = s.z + dir[i][0];
int x = s.x + dir[i][1];
int y = s.y + dir[i][2];
if(judge(x, y, z)){
if(x == ex && y == ey && z == ez){
return s.time + 1;
}
tem.x = x;tem.y = y;tem.z = z;tem.time = s.time + 1;
my.push(tem);
v[z][x][y] = 1;
}
}
}
return -1;
}
int main(){
int i, j, k;
//freopen("in.txt", "r", stdin);
while(scanf("%d%d%d", &l, &r, &c) != EOF){
if(!l && !c && !r) return 0;
memset(v, 0, sizeof(v));
//ans = -1;
getchar();
for(i = 1; i <= l; i++){
for(j = 1; j <= r; j++){
for(k = 1; k <= c; k++){
scanf("%c", &map[i][j][k]);
if(map[i][j][k] == 'S'){
sx = j;sy = k;sz = i;
}
if(map[i][j][k] == 'E'){
ex = j;ey = k;ez = i;
}
}
getchar();
}
getchar();
}
ans = BFS();
if(ans == -1){
printf("Trapped!\n");
}
else{
printf("Escaped in %d minute(s).\n", ans);
}
}
return 0;
}