#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <queue>
using namespace std ;
int L=0, R=0, C=0 ;
char maze[31][31][31] ;
int dis[31][31][31] ;
char start = 'S' ;
char rock = '#' ;
char road = '.' ;
char out = 'E' ;
char line[31] ;
struct position
{
int x ;
int y ;
int z ;
int minute ;
};
struct position startPosition ;
struct position exitPosition ;
struct position getUpPosition( struct position pos)
{
pos.x++ ;
pos.minute++ ;
return pos ;
}
struct position getDownPosition( struct position pos)
{
pos.x-- ;
pos.minute++ ;
return pos ;
}
struct position getLeftPosition( struct position pos)
{
pos.y++ ;
pos.minute++ ;
return pos ;
}
struct position getRightPosition( struct position pos)
{
pos.y-- ;
pos.minute++ ;
return pos ;
}
struct position getForwardPosition( struct position pos)
{
pos.z++ ;
pos.minute++ ;
return pos ;
}
struct position getBackPosition( struct position pos)
{
pos.z-- ;
pos.minute++ ;
return pos ;
}
void bfs(struct position pos)
{
queue<struct position> myQueue ;
myQueue.push(pos) ;
dis[pos.x][pos.y][pos.z] = pos.minute ;
while( !myQueue.empty() ) {
struct position top = myQueue.front() ;
myQueue.pop() ;
if( top.x + 1 < L && dis[top.x+1][top.y][top.z]==-1 && maze[top.x+1][top.y][top.z]!=rock ) {
struct position upPos = getUpPosition(top) ;
dis[upPos.x][upPos.y][upPos.z] = upPos.minute ;
myQueue.push(upPos) ;
}
if( top.x - 1 >= 0 && dis[top.x-1][top.y][top.z]==-1 && maze[top.x-1][top.y][top.z]!=rock) {
struct position downPos = getDownPosition(top) ;
dis[downPos.x][downPos.y][downPos.z] = downPos.minute ;
myQueue.push(downPos) ;
}
if( top.y + 1 < R && dis[top.x][top.y+1][top.z]==-1 && maze[top.x][top.y+1][top.z]!=rock) {
struct position lefPos = getLeftPosition(top) ;
dis[lefPos.x][lefPos.y][lefPos.z] = lefPos.minute ;
myQueue.push(lefPos) ;
}
if( top.y - 1 >= 0 && dis[top.x][top.y-1][top.z]==-1 && maze[top.x][top.y-1][top.z]!=rock) {
struct position rightPos = getRightPosition(top) ;
dis[rightPos.x][rightPos.y][rightPos.z] = rightPos.minute ;
myQueue.push(rightPos) ;
}
if( top.z + 1 < C && dis[top.x][top.y][top.z+1]==-1 && maze[top.x][top.y][top.z+1]!=rock) {
struct position forwardPos = getForwardPosition(top) ;
dis[forwardPos.x][forwardPos.y][forwardPos.z] = forwardPos.minute ;
myQueue.push(forwardPos) ;
}
if( top.z - 1 >= 0 && dis[top.x][top.y][top.z-1]==-1 && maze[top.x][top.y][top.z-1]!=rock) {
struct position backPos = getBackPosition(top) ;
dis[backPos.x][backPos.y][backPos.z] = backPos.minute ;
myQueue.push(backPos) ;
}
}
}
int main()
{
while ( cin.getline(line,30) ) {
char * p = strtok(line, " \t\n") ; L = atoi (p) ;
p = strtok(NULL, " \t\n") ; R = atoi (p) ;
p = strtok(NULL, " \t\n") ; C = atoi (p) ;
if( L==0 && R==0 && C==0 ) break ;
for( int i=0 ; i<L ; i++ ) {
for( int j=0 ; j<R; j++) {
cin.getline(line,31) ;
//cout << line << endl ;
for( int k=0 ; k < C ; k++) {
maze[i][j][k] = line[k] ;
if( line[k] == start ) {
startPosition.x = i ;
startPosition.y = j ;
startPosition.z = k ;
}
if( line[k] == out ) {
exitPosition.x = i ;
exitPosition.y = j ;
exitPosition.z = k ;
}
dis[i][j][k] = -1 ;
}
}
cin.getline(line,31) ;
}
startPosition.minute = 0 ;
bfs(startPosition) ;
if( dis[exitPosition.x][exitPosition.y][exitPosition.z] != -1 ) {
cout << "Escaped in " << dis[exitPosition.x][exitPosition.y][exitPosition.z] << " minute(s)." << endl ;
}else
cout << "Trapped!" << endl ;
}
//system("pause");
}
沒有留言:
張貼留言