hdu 1253 胜利大逃亡

本文介绍了一个使用BFS算法解决三维迷宫中从起点到终点的逃离问题,考虑了时间限制和墙壁等因素。通过代码实现,详细解释了如何通过BFS算法在给定的时间内找到从(0,0,0)到(a-1,b-1,c-1)的最短路径,同时介绍了关键函数和变量的作用。

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数组是个新东西,待研究







评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值