【一本通1248:Dungeon Master&&洛谷UVA532 Dungeon Master】

时间:2023-03-08 18:39:11

若不会广搜转向[广搜]

【题目描述】

这题是一个三维的迷宫题目,其中用‘.’表示空地,‘#’表示障碍物,‘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解,每次去队首元素,如果是终点则输出结果移动的次数,否则,从该点开始分别向东南西北上下移动(如果可以走的话)并继续搜,如果到队列为空还没搜到解法,则说明无解。

首先,这个提示很明显了吧QAQ

这说白了就是一个三维迷宫

多写几行数组,多几个特判就过了qwq

代码如下:

#include<bits/stdc++.h>
using namespace std;
int l,n,m;
struct pos{
int z,x,y,step;
pos(int z,int x,int y,int step):z(z),x(x),y(y),step(step){}
};
int sz,sx,sy;
int tz,tx,ty;
bool mat[][][];
bool vis[][][];
const int dz[]={,,,-,,},
dx[]={,,,,-,},
dy[]={,,,,,-};
bool pan(int z,int x,int y){
return z>=&&z<=l&&x>=&&x<=n&&y>=&&y<=m&&mat[z][x][y]==;
}
int main(){
while(true){
cin>>l>>n>>m;
if(l==&&n==&&m==)break;
for(int k=;k<=l;k++){
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
char c;
cin>>c;
if(c=='.')mat[k][i][j]=;
else if(c=='#')mat[k][i][j]=;
else if(c=='S'){
mat[k][i][j]=;
sz=k;
sx=i;
sy=j;
}else if(c=='E'){
mat[k][i][j]=;
tz=k;
tx=i;
ty=j;
}
vis[k][i][j]=;
}
}
}
queue<pos>q;
q.push(pos(sz,sx,sy,));
vis[sz][sx][sy]=;
bool flag=;
while (!q.empty())
{
pos head=q.front();
q.pop();
if(head.z==tz&&head.x==tx&&head.y==ty){
cout<<"Escaped in "<<head.step<<" minute(s).\n";
flag=;
break;
}
for(int i=;i<;i++){
int zz=head.z+dz[i],xx=head.x+dx[i],yy=head.y+dy[i];
if(!pan(zz,xx,yy))continue;
if(vis[zz][xx][yy])continue;
q.push(pos(zz,xx,yy,head.step+));
vis[zz][xx][yy]=;
}
}
if(flag)cout<<"Trapped!\n";
}
}