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;
}

  

 

posted on 2017-04-19 18:44  北溟有鱼。  阅读(108)  评论(0编辑  收藏  举报