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;
}
人生如修仙,岂是一日间。何时登临顶,上善若水前。
浙公网安备 33010602011771号