hdu 1253 胜利大逃亡(搜索)

因为学广搜那几天状态非常不好,所以之前对搜索几乎完全不会。现在要重新学搜索。

1、代码中声明一个队列的时候是q<node>q,开始的时候一直写成q(node)q。

2、q.push(cur)是为了给队列一个最早的元素,使q.empty()判定不为空。

3、q.pop()是删除队列中已经检测过的元素。

4、map[x][y][z]=1。对于已经走过的格子,将其值用1标记。

5、q.push(next)。对于符合条件的元素,将其加入队列中,在以后的循环中进行检测。

#include<stdio.h>
#include<queue>
using namespace std;
struct node 
{
	int x,y,z,step;
};
int map[55][55][55],a,b,c,t;
int dir[6][3]={0,0,-1, 0,0,1, 0,1,0, 0,-1,0, 1,0,0, -1,0,0};

int judge(int x,int y,int z)
{
	if(x<a&&y<b&&z<c&&x>=0&&y>=0&&z>=0&&map[x][y][z]==0)
		return 1;
	return 0;
}

int bfs()
{
	node cur,next;
	queue<node>q;
	int i,x,y,z;
	cur.x=cur.y=cur.z=cur.step=0;
	q.push(cur);
	map[0][0][0]=1;
	while(!q.empty())
	{
		cur=q.front();
		q.pop();
		if(cur.step>=t)
			return -1;
		next.step=cur.step+1;
		for(i=0;i<6;i++)
		{
			next.x=x=cur.x+dir[i][0];
			next.y=y=cur.y+dir[i][1];
			next.z=z=cur.z+dir[i][2];
			if(judge(x,y,z))
			{
				if(x==a-1&&y==b-1&&z==c-1)
					return next.step;
				map[x][y][z]=1;
				q.push(next);
			}
		}
	}
	return -1;
}	
int main()
{
	int i,j,k,T;
	int ans;
	scanf("%d",&T);
	while(T--)
	{
		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]);
				if(map[a-1][b-1][c-1])
					ans=-1;
				else
					ans=bfs();
				printf("%d\n",ans);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值