题目地址: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;
}