hdu1253(胜利大逃亡)

本文介绍了一个典型的广度优先搜索(BFS)算法应用案例,用于解决三维迷宫中的最短路径问题。通过详细的代码解析,展示了如何实现BFS算法,并处理了边界条件和特殊情况,如起点或终点为障碍物的情况。

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

//本题的难度不大大、、只需要用BFS就好了,但是要注意的是,题目给的数据还是很坑的,在做的时候应该多多注意,比如最后一个出口也可以是墙(好坑啊),虽然第一个也可以是墙但是第一个可以忽略,我刚刚开始就是这样错了  以为不可以忽略,错了半个小时,后来才知道,一个字坑啊,,,这个题目还是很具有BFS的代表性的,不可以用优先队列哦  否则会超时

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <queue>
using namespace std;
struct node
{
	int x;
	int y;
	int z;
	int times;
};
int map[60][60][60];
int v[60][60][60];
int x,y,z,t;
int d[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};


int  BFS()
{
	int i,j,k,x1,y1,z1;
     queue<node>q;
	 node st,en;
	 st.x=0;
	 st.y=0;
	 st.z=0;
	 st.times=0;
	 q.push(st);
	 v[0][0][0]=1;
//	 for(i=0;i<6;i++)
	//	 printf("%d %d %d\n",d[i][0],d[i][1],d[i][2]);
	 while(!q.empty())
	 {
		 st=q.front();
		 q.pop();
		 if(st.x==x-1&&st.y==y-1&&st.z==z-1&&st.times<=t)
		 {
			 return st.times;
		 }
		 for(i=0;i<6;i++)
		 {
			 x1=st.x+d[i][0];
			 y1=st.y+d[i][1];
			 z1=st.z+d[i][2];
			 if(map[x1][y1][z1]==0&&x1>=0&&y1>=0&&z1>=0&&x1<x&&y1<y&&z1<z&&v[x1][y1][z1]==0)
			 {
			    en.times=st.times+1;
				en.x=x1;
				en.y=y1;
				en.z=z1;
				q.push(en);
                v[x1][y1][z1]=1;
			 } 
		 }
	 }
	 return -1;
}
int main()
{
	int i,j,k;
	int T;
    scanf("%d",&T);
	while(T--)
	{
        scanf("%d %d %d %d",&x,&y,&z,&t);
		for(i=0;i<x;i++)
			for(j=0;j<y;j++)
				for(k=0;k<z;k++)
                  scanf("%d",&map[i][j][k]);
		if(map[x-1][y-1][z-1]!=1)
		{
			memset(v,0,sizeof(v));
	     	k=BFS();
	    	printf("%d\n",k);
		}
		else
			printf("-1\n");
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值