1248:Dungeon Master
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
这题是一个三维的迷宫题目,其中用‘.’表示空地,‘#’表示障碍物,‘S’表示起点,‘E’表示终点,求从起点到终点的最小移动次数,解法和二维的类似,只是在行动时除了东南西北移动外还多了上下。可以上下左右前后移动,每次都只能移到相邻的空位,每次需要花费一分钟,求从起点到终点最少要多久。
【输入】
多组测试数据。
一组测试测试数据表示一个三维迷宫:
前三个数,分别表示层数、一个面的长和宽,后面是每层的平面图。前三个数据为三个零表示结束。
【输出】
最小移动次数。
【输入样例】
3 4 5
S....
.###.
.##..
###.#
#####
#####
##.##
##...
#####
#####
#.###
####E
1 3 3
S##
#E#
###
0 0 0
【输出样例】
Escaped in 11 minute(s).
Trapped!
【提示】
对于题目给出数据的含义就是输入l,r,c,分别代表迷宫有l层,每层长宽分别是c,r。对于数据以可以这样移动:
(1,1,1)->(1,1,2)->(1,1,3)->(1,1,4)->(1,1,5)->(1,2,5)->
(1,3,5)->(1,3,4)->(1,4,4)->(2,4,4)->(2,4,5)->(3,4,,5)
共11步就可以到达终点 对于数据二明显不能到达,则输出Trapped!
这题用BFS解,每次去队首元素,如果是终点则输出结果移动的次数,否则,从该点开始分别向东南西北上下移动(如果可以走的话)并继续搜,如果到队列为空还没搜到解法,则说明无解。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int s[30][30][30];
int que[100][5];
int c,k,g,i,j,f;
int z[6]={0,0,0,0,-1,1};
int x[6]={-1,1,0,0,0,0};
int y[6]={0,0,-1,1,0,0};
int jz,jx,jy;
bool bl;
char a;
void sca(){
memset(s,0,sizeof(s));
for(i=1;i<=g;i++){
for(j=1;j<=k;j++){
for(f=1;f<=c;f++){
cin>>a;
if(a=='S') {
s[i][j][f]=1;
que[1][1]=i;que[1][2]=j;que[1][3]=f;que[1][4]=0;
}
else if(a=='E') {
s[i][j][f]=0;
jz=i;jx=j;jy=f;
}
else if(a=='#') s[i][j][f]=1;
else if(a=='.') s[i][j][f]=0;
//printf("%c",a);
}
}
//printf("\n");
}
}
void bfs(){
bl=false;
int t=0,w=1;
do {
t++;
for(int i=0;i<6;i++){
int zz=que[t][1]+z[i];
int xx=que[t][2]+x[i];
int yy=que[t][3]+y[i];
if(zz>0&&zz<=g&&xx>0&&xx<=k&&yy>0&&yy<=c&&s[zz][xx][yy]==0){
s[zz][xx][yy]=1;
w++;
que[w][1]=zz;que[w][2]=xx;que[w][3]=yy;que[w][4]=que[t][4]+1;
if(zz==jz&&xx==jx&&yy==jy){
printf("Escaped in %d minute(s).\n",que[w][4]);
bl=true;break;
}
}
}
}while(w>t&&bl==false);
if(!bl) printf("Trapped!\n");
}
int main(int argc, char *argv[])
{
while(1){
scanf("%d %d %d",&g,&k,&c);
if(g==0||k==0||c==0) return 0;
sca();
bfs();
}
return 0;
}