hdu1253胜利大逃亡(bfs)

本文介绍了一个基于广度优先搜索(BFS)解决三维迷宫问题的方法,旨在寻找从起点到终点的最短路径。考虑到时间限制,采用BFS确保了效率。通过结构体节点来记录坐标和步数,并利用队列进行遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:不会看不懂中文吧?

思路:出口已知,因为有个时间限制,当然时间越短越好,所以bfs,不过写得似乎很挫1800多ms,能过,将就着看哈!大笑

代码如下:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
typedef struct
{
	int x,y,z;
	int cnt;
}mor;
struct node
{
	int x,y,z;
}zit[6]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
int map[50][50][50],book[50][50][50],a,b,c,t,flag;
bool pan(int x,int y,int z)
{
	if(x>=0&&x<a&&y>=0&&y<b&&z>=0&&z<c)
		return true;
	return false;
}

void bfs()
{
	queue<mor>que;
	mor star,now,next;
	star.x=star.y=star.z=star.cnt=0;
	while(!que.empty())
		que.pop();
	que.push(star);
	book[0][0][0]=1;
	int i,j,n;
	while(!que.empty())
	{
		now=que.front();
		que.pop();
		if(now.cnt>=t)
			return ;
		for(i=0;i<6;i++)
		{
			next.x=now.x+zit[i].x;
			next.y=now.y+zit[i].y;
			next.z=now.z+zit[i].z;
			if(pan(next.x,next.y,next.z) && !map[next.x][next.y][next.z] && !book[next.x][next.y][next.z])
			{
				book[next.x][next.y][next.z]=1;
				if(next.x==a-1&&next.y==b-1&&next.z==c-1)
				{
					flag=0;
					printf("%d\n",now.cnt+1);
					return ;
				}
				next.cnt=now.cnt+1;
				que.push(next);
			}
		}
	}
	return ;
}

int main()
{
	int i,j,k,ps;
	scanf("%d",&ps);
	while(ps--)
	{
		scanf("%d%d%d%d",&a,&b,&c,&t);
		memset(book,0,sizeof(book));
		for(i=0;i<a;i++)
		for(j=0;j<b;j++)
		for(k=0;k<c;k++)
			scanf("%d",&map[i][j][k]);
		flag=1;
		bfs();
		if(flag)
			printf("-1\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小胡同的诗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值