zoukankan      html  css  js  c++  java
  • Dungeon Master 地下城大师(BFS进阶)

    题目链接:http://poj.org/problem?id=2251

    知道你看不懂题(手动滑稽):友情链接

    题意:找到从S到E的最少步数的路径,输出该步数,不过有意思的是这个类似迷宫问题不是二维的,是一个三维迷宫,其实三维迷宫和二维没多大差别,只是时间复杂度更多一点,搜索的方向更多一点,初次接触可能会被难住。

    代码:

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<queue>
    using namespace std;
    struct node//定义三维坐标结构体 
    {
        int z;
        int x;
        int y;
    };
    int dx[6]={0,-1,0,1,0,0},dy[6]={-1,0,1,0,0,0},dz[6]={0,0,0,0,-1,1};//六个方向的搜索 
    bool vis[31][31][31];//vis数组记录是否走过,剪枝去重。 
    char mp[31][31][31];
    int d[31][31][31];//记录步数的三位数组。
    int l,r,c,gx,gy,gz,sx,sy,sz;//g则是开始的坐标,S则是终止的坐标。
    int bfs()
    {
        queue<node>q;
        q.push({gz,gx,gy});
        vis[gz][gx][gy]=1;
        d[gz][gx][gy]=0;
        while(q.size())
        {
            node p=q.front();
            q.pop();
            if(p.x==sx&&p.y==sy&&p.z==sz)
            break;
            for(int i=0;i<6;i++)//六个方向搜寻 
            {
                int nx=p.x+dx[i];
                int ny=p.y+dy[i];
                int nz=p.z+dz[i];
                if(nx>=0&&nx<r&&nz>=0&&nz<l&&ny>=0&&ny<c&&!vis[nz][nx][ny]&&mp[nz][nx][ny]!='#')
                {
                    q.push({nz,nx,ny});//如果满足就加入队列。
                    vis[nz][nx][ny]=1;//标记此坐标来过。 
                    d[nz][nx][ny]=d[p.z][p.x][p.y]+1;//步数加一。
                    //printf("d:%d nx:%d ny:%d nz:%d\n",d[nz][nx][ny],nx,ny,nz);这个是我调试时用的 。 
                }
            }
        }
        return d[sz][sx][sy];//返回步数 。
    }
    int main(void)
    {
        int sum;
        while(cin>>l>>r>>c)
        {
            memset(d,0,sizeof d);//初始化 
            memset(vis,0,sizeof vis);//初始化 
            if(l==0&&r==0&&c==0)
            break;
            for(int i=0;i<l;i++)
            {
                for(int j=0;j<r;j++)
                {
                    for(int k=0;k<c;k++)
                    {
                        cin>>mp[i][j][k];
                        if(mp[i][j][k]=='S')//记录起点坐标。
                        {
                            gz=i;
                            gx=j;
                            gy=k;
                            mp[i][j][k]='.';
                        }
                        if(mp[i][j][k]=='E')//记录终点坐标。
                        {
                            sz=i;
                            sx=j;
                            sy=k;
                            mp[i][j][k]='.';
                        }
                    }
                }
                getchar();
            }
            sum=bfs();
            if(sum)
            printf("Escaped in %d minute(s).\n",sum);
            else
            printf("Trapped!\n");
        }
        return 0;
    }

    小结一下:这个题其实没有多难,就就是一个广搜,只不过这个三维地图可能有点唬人,不过还要掌握了广搜,这道题还是蛮简单的,不过我开始做的时候被卡了好久,最开始是觉得直接套模版可能会超时,后来发现其他的骚操作也想不到,然后就套模版,套模板的时候又被卡了几个小时,原因就在构建三维数组的时候Z轴搞错了,把数组的放置弄错了。

  • 相关阅读:
    【php】目录、路径和文件 操作
    [PHP100]留言板(一)
    Software--Architecture--Design
    Coursera--Deep Learning--吴恩达 深度学习笔记 2017.12.10
    DeepLearning.ai--吴恩达--Chapter 2_Vecterization
    Datastructure--学习资源 Center
    leetcode--Algorithm--Array
    Coursera--DataStructure-加州理工大学圣地亚哥分校课程
    Coursera--Deep Learning--吴恩达 深度学习笔记 2017.12.03
    Data Structure & Algorithm
  • 原文地址:https://www.cnblogs.com/Mangata/p/12230404.html
Copyright © 2011-2022 走看看