zoukankan      html  css  js  c++  java
  • hdu 1240(三维广搜)

    题意:

    有一个n*n*n的三维空间。

    给你起始坐标和终点坐标。要你从起点到终点,问最少需要多少步走出去。如果走不出去则输出"NO ROUTE"。

    空间中 'O' 表示这个点可以走,'X'表示这个点不能走。

    题解:

    三维广搜。这是一道水题

    直接上代码:

    #include <iostream>
    #include <queue>
    #include <cstdio>
    
    using namespace std;
    
    typedef struct point        //空间 点结构体
    {
        int x,y,z;              //x,y,z坐标   x对应i,y对应j,z对应h。(第i行,第j列,高h)
        int step;               //步数
    }Point;
    
    const int MAX=12;
    
    char mmap[MAX][MAX][MAX];   //地图
    
    int n;
    string str;
    int si,sj,sh;         //保存起点坐标
    int ei,ej,eh;         //保存终点坐标
    
    Point cur,nxt;
    
    int dx[]={-1,1,0,0,0,0};    //方向控制 前 后 左 右 上 下
    int dy[]={0,0,-1,1,0,0};
    int dz[]={0,0,0,0,1,-1};
    
    void bfs()
    {
        queue<Point> q;
        cur.x=si;
        cur.y=sj;
        cur.z=sh;
        cur.step=0;
        q.push(cur);
        while(!q.empty())
        {
            cur=q.front();
            q.pop();
    
            for(int i=0;i<6;i++)
            {
                nxt.x=cur.x+dx[i];
                nxt.y=cur.y+dy[i];
                nxt.z=cur.z+dz[i];
                nxt.step=cur.step+1;
    
                if(nxt.x<0||nxt.x>=n||nxt.y<0||nxt.y>=n||nxt.z<0||nxt.z>=n) continue;  //如果坐标越界 continue;
    
                if(nxt.x==ei&&nxt.y==ej&&nxt.z==eh)       //到达终点 返回
                {
                    cout<<n<<" "<<nxt.step<<endl;
                    return;
                }
                if(mmap[nxt.z][nxt.x][nxt.y]=='O')   //把搜过的点设成不能走的点
                {
                    mmap[nxt.z][nxt.x][nxt.y]='X';
                    q.push(nxt);
                }
            }
        }
        cout<<"NO ROUTE"<<endl;    //如果队列为空 则 没有路
    }
    
    int main()
    {
        while(cin>>str>>n)
        {
            for(int h=0;h<n;h++)
            {
                for(int i=0;i<n;i++)
                {
                    for(int j=0;j<n;j++)
                    {
                        cin>>mmap[h][i][j];
                    }
                }
            }
            cin>>sj>>si>>sh;
            cin>>ej>>ei>>eh;
            cin>>str;
    
            if(si==ei&&sj==ej&&sh==eh)   //如果起点和终点一样
            {
                cout<<n<<" "<<0<<endl;
                continue;
            }
    
            bfs();
        }
        return 0;
    }
    

      

    人生如修仙,岂是一日间。何时登临顶,上善若水前。
  • 相关阅读:
    ASP.NET性能优化篇(转载)
    Apache相关
    UVa11292 The Dragon of Loowater
    POJ2653 Pickup sticks
    POJ2155 Matrix
    POJ3009 Curling 2.0
    POJ1066 Treasure Hunt
    UVa11729 Commando War
    Ubuntu下解决压缩文件的文件名乱码问题
    HDU3415 Max Sum of MaxKsubsequence
  • 原文地址:https://www.cnblogs.com/f-society/p/6734957.html
Copyright © 2011-2022 走看看