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