题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1253
这个题目主要难点是比那成了三维,而且题目说了,数据两很大,所以这种搜索题采用BFS最好,而且是普通的BFS就好
若是采用DFS必然会超时ps:我试验过,如果想不超时,只能进行剪枝,这次本文只介绍BFS
按照惯例,说一下程序的实现注意点
1,三维数组的数据录入问题,注意看清题目的要求,如果建立自己的坐标系,那么搜索的起始位置和搜索的终止条件要改变
2.方向是六个方向,注意别弄错了
3,提交时一定要是C++提交,否则你的算法肯定会超时(除非你特别牛,算法效率很高)
还是经典的三部曲,很简单,直接给出代码,不懂的童鞋可以在下边评论,有评必回!
#include <iostream> #include <stdio.h> #include<memory.h> #include <queue> #define N 50 using namespace std; struct persion { int x,y,z; int time; }; int directions[6][3]={{1,0,0},{0,1,0},{0,0,1},{-1,0,0},{0,-1,0},{0,0,-1}}; int a,b,c,t; int map[N][N][N]; persion my,cur,next; int BFS(int x,int y,int z) { queue<persion>q; my.x=x; my.y=y; my.z=z; my.time=0; q.push(my); while(!q.empty()) { cur=q.front(); q.pop(); for(int i=0;i<6;i++) { next.x=cur.x+directions[i][0]; next.y=cur.y+directions[i][1]; next.z=cur.z+directions[i][2]; if(next.x<a&&next.y<c&&next.z<b&&next.x>=0&&next.y>=0&&next.z>=0&&map[next.x][next.y][next.z]!=1&&next.time<=t) { if(next.x==a-1&&next.y==c-1&&next.z==b-1) //如果找到了出口 返回当前走的步数 return cur.time+1; next.time=cur.time+1; //下一步可以走该方向,将该方向的信息完善后打入队列中 q.push(next); map[next.x][next.y][next.z]=1; //标记一下该方向的节点已经走过 } } } return -1; } int main() { int sum,i,j,x,k; scanf("%d",&x); while(x--) { scanf("%d%d%d%d",&a,&b,&c,&t); for(i=0;i<a;i++) for(k=0;k<b;k++) for(j=0;j<c;j++) scanf("%d",&map[i][j][k]); sum=BFS(0,0,0); cout<<sum<<endl; } return 0; }