HDU/HDOJ 1253 胜利大逃亡 广度优先搜索算法 迷宫寻路

来源:互联网 发布:绝地求生辅助网站源码 编辑:程序博客网 时间:2024/05/22 14:54

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253

思路:从两维扩展到了三维,使用了三维数组,关于三维数组的理解,可以自己去google,无非就是从平面扩展到了空间,方向也成了6个,前,后,左,右,上,下,其他的都不变,注意一下坑爹的边缘数据就可以了。

#include <iostream>#include <string>#include <cstdio>#include <cmath>#include <vector>#include <algorithm>#include <sstream>#include <cstdlib>#include <fstream>#include <queue>using namespace std;struct node{int x,y,z,step;};queue<node> Q;//bool visit[51][51][51]; //优化了空间 int maze[51][51][51];int dir[6][3]={{-1,0,0},{1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};//六个方向 int m,n,k,t;bool isbound(int a,int b,int c){   //边界判断 if(a<0 || a>=m || b<0 || b>=n ||c<0 ||c>=k)return true;return false;}void bfs(){if(maze[m-1][n-1][k-1]==1) {cout<<-1<<endl;return ;}  //特殊位置     if(maze[0][0][0]==0&&m*n*k==1){ cout<<-1<<endl;return ;}      node p,q;p.x=0;p.y=0;p.z=0;p.step=0;maze[0][0][0]=1;Q.push(p);while(!Q.empty()){p=Q.front();Q.pop();if(p.x==m-1&&p.y==n-1&&p.z==k-1 &&p.step<=t){cout<<p.step<<endl;return ;}for(int i=0;i<6;i++){q.x=p.x+dir[i][0];q.y=p.y+dir[i][1];q.z=p.z+dir[i][2];if(isbound(q.x,q.y,q.z))continue;if(maze[q.x][q.y][q.z]==1)continue;//if(visit[q.x][q.y][q.z])continue;q.step=p.step+1;//visit[q.x][q.y][q.z]=1;  内存优化 maze[q.x][q.y][q.z]=1;Q.push(q);}}cout<<-1<<endl;}int main(){//ifstream fin;//fin.open("data1.txt");int c;//cin>>c;scanf("%d",&c);while(c--){//cin>>m>>n>>k>>t;    //大规模输入还是用scanf不超时 scanf("%d %d %d %d",&m,&n,&k,&t);for(int i=0;i<m;i++)for(int j=0;j<n;j++)for(int s=0;s<k;s++)scanf("%d",&maze[i][j][s]);while(!Q.empty())Q.pop();//memset(visit,0,sizeof(visit));//visit[0][0][0]=1;bfs();}return 0;}