Is an escape possible? If yes, how long will it take?
Input
The input consists of a number of dungeons. Each dungeon description starts with a line containing three integers L, R and C (all limited to 30 in size).
L is the number of levels making up the dungeon.
R and C are the number of rows and columns making up the plan of each level.
Then there will follow L blocks of R lines each containing C characters. Each character describes one cell of the dungeon. A cell full of rock is indicated by a '#' and empty cells are represented by a '.'. Your starting position is indicated by 'S' and the exit by the letter 'E'. There's a single blank line after each level. Input is terminated by three zeroes for L, R and C.
Output
Each maze generates one line of output. If it is possible to reach the exit, print a line of the form
Escaped in x minute(s).
where x is replaced by the shortest time it takes to escape.
If it is not possible to escape, print the line
Trapped!
Sample Input
3 4 5
S....
.###.
.##..
###.#
#####
#####
##.##
##...
#####
#####
#.###
####E
1 3 3
S##
#E#
###
0 0 0
Sample Output
Escaped in 11 minute(s).
Trapped!
题解:最初我试了一下动态规划,结果失败,为什么呢?因为动态规划先做什么后做什么必须明确,而迷宫问题却不知道先算谁后算谁.还是广度优先快.
实现队列非常简单,一定要手动背写下来.
#include<iostream>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<time.h>
#include<stdlib.h>
using namespace std;
int a[31][31][31];
char map[31][31][31];
int xsize, ysize, zsize;
struct Point{
int x, y, z;
};
struct queue{
Point a[10000];
int head, rear;
void init(){
head = rear = 0;
}
void enq(int x,int y ,int z){
Point&p = a[rear];
p.x = x;
p.y = y;
p.z = z;
rear++;
rear %= 10000;
}
Point& deq(){
int temp = head;
head++;
head %= 10000;
return a[temp];
}
bool isEmpty(){
return rear == head;
}
};
queue q;
int sx, sy, sz;
int ans=-1;
void check(int x, int y, int z,int father){
if (x < 0 || y < 0 || z < 0)return;
if (x >= xsize || y >= ysize || z >= zsize)return;
if (~a[x][y][z])return;
if (map[x][y][z] == '#')return;
if (map[x][y][z] == 'E'){
ans = father + 1;
return;
}
a[x][y][z] = father + 1;
q.enq(x, y, z);
}
void go(){
memset(a, -1, sizeof(a));
ans = -1;
q.init();
q.enq(sx, sy, sz);
a[sx][sy][sz] = 0;
while (!q.isEmpty()){
Point &p = q.deq();
int&x = p.x;
int &y = p.y;
int &z = p.z;
int &f = a[x][y][z];
check(x + 1, y, z,f);
check(x - 1, y, z,f);
check(x, y + 1, z,f);
check(x, y - 1, z,f);
check(x, y, z + 1,f);
check(x, y, z - 1,f);
if (~ans)return;
}
}
int main(){
while (cin >> xsize >> ysize >> zsize && (xsize || ysize || zsize)){
int i, j, k;
for (i = 0; i < xsize; i++){
for (j = 0; j < ysize; j++){
for (k = 0; k < zsize; k++){
cin >> map[i][j][k];
if (map[i][j][k] == 'S'){
sx = i;
sy = j;
sz = k;
a[i][j][k] = -1;
}
}
}
}
go();
if (ans==-1 ) cout << "Trapped!" << endl;
else cout << "Escaped in " << ans << " minute(s)." << endl;
}
return 0;
}