这道题目首先题意不好理解,我折腾了个把小时才弄懂题目的意思(不是英语不好),发现最重要的信息就是三维空间(3D dungeon),有L层,每层的结构为R*C的矩阵,这样就组成了一个三维的矩阵。其次,这个题目适合用广搜,凡是涉及到最短路的题目一般都用广搜,除非广搜不行,在考虑深搜。例如poj3009,这题也是求最少的移动次数,但不能用广搜,因为它的每一步都会使得状态改变。弄懂了题意后就是一道广搜水题了,注意这里每个节点有6个方向可以行进(三维空间嘛),用三维数组模拟maze,就可以很轻松的解决这题。另外这里还要注意一个小问题,以后设置全局变量尽量不要用count取名,不知道为什么count似乎与标准库中的保留字或其他东西相关,因此总是报错。试过很多次,都是这样的。经验之谈。下面是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <queue>
using namespace std;
#define Max 50
bool maze[Max][Max][Max];
bool flag[Max][Max][Max];
int dir,h,w;
typedef struct Node{
int x;
int y;
int dir;
int deep;
}node;
int sx,sy,sdir,ex,ey,edir;
int Count;
bool bfs(){
queue<node> Que;
node point;
point.x=sx;
point.y=sy;
point.dir=sdir;
point.deep=0;
Que.push(point);
flag[sdir][sx][sy]=1;
int x,y,bdir,bdeep;
while(!Que.empty()){
point=Que.front();
Que.pop();
x=point.x,y=point.y;
bdir=point.dir,bdeep=point.deep;
if(x==ex && y==ey && bdir==edir){
Count=bdeep;
return true;
}
if(y-1>=1 && maze[bdir][x][y-1] && !flag[bdir][x][y-1]){
point.x=x;
point.y=y-1;
point.dir=bdir;
point.deep=bdeep+1;
flag[bdir][x][y-1]=1;
Que.push(point);
}
if(y+1<=w && maze[bdir][x][y+1] && !flag[bdir][x][y+1]){
point.x=x;
point.y=y+1;
point.dir=bdir;
point.deep=bdeep+1;
flag[bdir][x][y+1]=1;
Que.push(point);
}
if(x-1>=1 && maze[bdir][x-1][y] && !flag[bdir][x-1][y]){
point.x=x-1;
point.y=y;
point.dir=bdir;
point.deep=bdeep+1;
flag[bdir][x-1][y]=1;
Que.push(point);
}
if(x+1<=h && maze[bdir][x+1][y] && !flag[bdir][x+1][y]){
point.x=x+1;
point.y=y;
point.dir=bdir;
point.deep=bdeep+1;
flag[bdir][x+1][y]=1;
Que.push(point);
}
if(bdir-1>=1 && maze[bdir-1][x][y] && !flag[bdir-1][x][y]){
point.x=x;
point.y=y;
point.dir=bdir-1;
point.deep=bdeep+1;
flag[bdir-1][x][y]=1;
Que.push(point);
}
if(bdir+1<=dir && maze[bdir+1][x][y] && !flag[bdir+1][x][y]){
point.x=x;
point.y=y;
point.dir=bdir+1;
point.deep=bdeep+1;
flag[bdir+1][x][y]=1;
Que.push(point);
}
}
return false;
}
int main(){
while(scanf("%d%d%d",&dir,&h,&w),dir){
memset(maze,0,sizeof(maze));
memset(flag,0,sizeof(flag));
char str;
for(int i=1;i<=dir;i++){
getchar();
for(int j=1;j<=h;j++){
for(int k=1;k<=w;k++){
str=getchar();
if(str=='.')
maze[i][j][k]=1;
else if(str=='S'){
sdir=i;
sx=j;
sy=k;
maze[i][j][k]=1;
}
else if(str=='E'){
edir=i;
ex=j;
ey=k;
maze[i][j][k]=1;
}
}
getchar();
}
}
if(bfs())
printf("Escaped in %d minute(s).\n",Count);
else
printf("Trapped!\n");
}
return 0;
}