hdu 1253 胜利大逃亡 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253
BFS(三维无坑)
题目大意:Ignatius从一个城堡(三维空间)逃离,有墙,有时间限制,问是否能逃出。
题目分析:城堡规模为a,b,c。要从(0,0,0)到(a-1,b-1,c-1),用BFS。
code:
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;//用ttime数组来存到此点的最短时间
int a,b,c,map[60][60][60],ttime[60][60][60],t;
int dir[6][3]={1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1};
struct node
{
int x,y,z,step;
};
bool judge(int x,int y,int z)
{
if(x<0||y<0||z<0||x>=a||y>=b||z>=c||map[x][y][z]==1)return true;
else return false;
}
int bfs(int x,int y,int z)
{
queue<node>que;
node first,next;
ttime[0][0][0]=0;
first.x=x,first.y=y,first.z=z,first.step=0;
que.push(first);
map[x][y][z]=1;
while(!que.empty())
{
first=que.front();
que.pop();
if(first.x==a-1&&first.y==b-1&&first.z==c-1)return first.step;
for(int i=0;i<6;i++)
{
next.x=first.x+dir[i][0];
next.y=first.y+dir[i][1];
next.z=first.z+dir[i][2];
if(judge(next.x,next.y,next.z))continue;
next.step=first.step+1;
if(next.step<ttime[next.x][next.y][next.z])
{//只有当走这条路用时更短时,才入列更新
que.push(next);
ttime[next.x][next.y][next.z]=next.step;
}
}
}
return ttime[a-1][b-1][c-1];
}
int main()
{
int tc,i,j,k;
scanf("%d",&tc);
while(tc--)
{
scanf("%d%d%d%d",&a,&b,&c,&t);
for(i=0;i<a;i++)
{
for(j=0;j<b;j++)
{
for(k=0;k<c;k++)
{
scanf("%d",&map[i][j][k]);
ttime[i][j][k]=0x7fffffff;
}//ttime数组初始化为无穷大
}
}
if(a+b+c-3>t)printf("-1\n");//剪枝,最短路长于时间限制
else printf("%d\n",bfs(0,0,0)<=t?bfs(0,0,0):-1);
}
}PS:除了ttime数组相关,大都是自己写的,基本思路已大体掌握。
有的需要ans数组存最优解系,后查找
judge()函数最好写在外面,有min()的话,也放外面
这次的ttime数组是个新东西,待研究
本文介绍了一个使用BFS算法解决三维迷宫中从起点到终点的逃离问题,考虑了时间限制和墙壁等因素。通过代码实现,详细解释了如何通过BFS算法在给定的时间内找到从(0,0,0)到(a-1,b-1,c-1)的最短路径,同时介绍了关键函数和变量的作用。
985

被折叠的 条评论
为什么被折叠?



