zoukankan      html  css  js  c++  java
  • 图论 --- 三维空间bfs

    <传送门>

    【题目大意】

    给你一个三维的迷宫,让你计算从入口走到出口最少步数。

    【题目分析】

    其实和二维迷宫还是一样的,还是用队列来做,由于BFS算法一般是不需要回溯的,所以我们就用不着还用一个visit数组来记录是否访问过,直接将走过的结点置为不可走就可。

    //Memory   Time
    //  356K     32MS
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<cmath>
    #include<queue>
    #include<algorithm>
    using namespace std;
    struct Node
    {
        int x,y,z;
        int step;
    };
    queue<Node> que;
    char Map[50][50][50];
    int sx,sy,sz;
    int ex,ey,ez;
    int dir_x[]={-1,1,0,0,0,0};
    int dir_y[]={0,0,-1,1,0,0};
    int dir_z[]={0,0,0,0,1,-1};
    void read(int n,int row,int col)
    {
        int i,j,k;
        for(i=0;i<n;i++)
        {
            for(j=0;j<row;j++)
            {
                for(k=0;k<col;k++)
                {
                    cin>>Map[i][j][k];
                    if(Map[i][j][k]=='S')
                    {
                        sx=i;
                        sy=j;
                        sz=k;
                    }
                    else if(Map[i][j][k]=='E')
                    {
                        ex=i;
                        ey=j;
                        ez=k;
                    }
                }
                getchar();
            }
            getchar();
        }
    }
    
    void BFS()
    {
        Node q;
        q.x=sx;
        q.y=sy;
        q.z=sz;
        q.step=0;
        que.push(q);
        while(!que.empty())
        {
            Node tp=que.front();
            que.pop();
            int x=tp.x;
            int y=tp.y;
            int z=tp.z;
            int step=tp.step;
            for(int i=0;i<6;i++)
            {
                int tx=x+dir_x[i];
                int ty=y+dir_y[i];
                int tz=z+dir_z[i];
                if(Map[tx][ty][tz]=='.')
                {
                    Node Q;
                    Q.x=tx;
                    Q.y=ty;
                    Q.z=tz;
                    Q.step=step+1;
                    que.push(Q);
                    Map[tx][ty][tz]='#';
                }
                else if(tx==ex&&ty==ey&&tz==ez)
                {
                    cout<<"Escaped in "<<step+1<<" minute(s)."<<endl;
                    return;
                }
            }
        }
        cout<<"Trapped!"<<endl;
    }
    
    int main()
    {
    //    freopen("cin.txt", "r", stdin);
        int i, j, k;
        int n,row,col;
        while(cin>>n>>row>>col&&(n+row+col))
        {
            while(!que.empty()) que.pop();
            getchar();
            read(n,row,col);
            BFS();
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Markdown示例
    初识Markdown
    Ubuntu源整理
    Vi编辑器入门
    Ubuntu,Linux入门系统
    [其他]volatile 关键字
    Qt5:随窗口大小变化背景图片自动缩放的实现
    Qt5:不规则按钮的实现---通过贴图实现
    windows编程:创建DLL
    [转]Firefox拦截12306订票网站的解决办法
  • 原文地址:https://www.cnblogs.com/crazyacking/p/3762946.html
Copyright © 2011-2022 走看看