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

【题目描述】

这题是一个三维的迷宫题目,其中用‘.’表示空地,‘#’表示障碍物,‘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[31][31][31];
bool vis[31][31][31];
const int dz[6]={1,0,0,-1,0,0},
          dx[6]={0,1,0,0,-1,0},
          dy[6]={0,0,1,0,0,-1};
bool pan(int z,int x,int y){
    return z>=1&&z<=l&&x>=1&&x<=n&&y>=1&&y<=m&&mat[z][x][y]==0;
}
int main(){
    while(true){
        cin>>l>>n>>m;
        if(l==0&&n==0&&m==0)break;
        for(int k=1;k<=l;k++){
            for(int i=1;i<=n;i++){
                for(int j=1;j<=m;j++){
                    char c;
                    cin>>c;
                    if(c=='.')mat[k][i][j]=0;
                    else if(c=='#')mat[k][i][j]=1;
                    else if(c=='S'){
                        mat[k][i][j]=0;
                        sz=k;
                        sx=i;
                        sy=j;
                    }else if(c=='E'){
                        mat[k][i][j]=0;
                        tz=k;
                        tx=i;
                        ty=j;
                    }
                    vis[k][i][j]=0;
                }
            }
        }
        queue<pos>q;
        q.push(pos(sz,sx,sy,0));
        vis[sz][sx][sy]=1;
        bool flag=1;
        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=0;
                break;
            }
            for(int i=0;i<6;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+1));
                vis[zz][xx][yy]=1;
            }
        }
        if(flag)cout<<"Trapped!\n";
    }
}

猜你喜欢

转载自www.cnblogs.com/gongcheng456/p/10741254.html