• 【一本通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).
    ";
                    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!
    ";
        }
    }
  • 相关阅读:
    设计模式之单例模式
    Java的8种基本数据类型的内存占用字节数和取值范围
    如何解析本地和线上XML文件获取相应的内容
    Android性能优化(一)之启动加速35%
    自定义控件?试试300行代码实现QQ侧滑菜单
    菜单开源库装逼大全
    View动画和属性动画
    第三方分享
    Android 谈谈封装那些事 --BaseActivity 和 BaseFragment(二)
    转:工具类之SpannableStringUtils(相信你会爱上它)
  • 原文地址:https://www.cnblogs.com/gongcheng456/p/10741254.html
Copyright © 2020-2023  润新知