D. Frog Traveler bfs优化

本文介绍了一种基于队列的迷宫寻路算法实现,通过动态规划思想找到从起点到终点的路径,并记录每一步的回溯信息。文章详细解释了如何利用数组存储状态、更新距离并最终输出路径。

链接

/*new year!*/
#include <iostream>
#include <cstring>
#include <string>
#include<map>
#include<queue>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#define debug(a) cout<<#a<<"="<<a<<endl;
#define cd(a) scanf("%d", &a)
#define ll long long
#define PII pair<int, int>
#define _for(i, a, b) for (int i = a; i < b; i++)
#define For(i, a, b) for (int i = a; i <= b; i++)
#define foR(i, b, a) for (int i = b; i >= a; i--)
#define ms(a,b) memset(a, b, sizeof a)
#define gcd(a, b) __gcd(a, b)
#define lcm(a, b) a / gcd(a, b) * b
#define INF 0x3f3f3f3f
using namespace std;
const int N = 3e5+10,mod=998244353;

int n, a[N], b[N], d[N], fa[N], dis;// 存储下落前的

void pf(int x){
	if(x==n)
		return;
	pf(fa[x]);
	printf("%d ",x);
}

void sov(){
	cin >> n;
	For(i, 1, n) cin >> a[i];
	For(i, 1, n) cin >> b[i];
	dis = n;  // 距离0有ndis
	queue<int> q;
	q.push(n);
	while(!q.empty()){
		int x = q.front();
		q.pop();

		if(x<=0){
			printf("%d\n",d[x]);
			pf(x);
			return ;
		}
		int y = x + b[x];// 下落
		for (int i = min(y - 1, dis - 1); i >= y - a[y];i--){  // 更新 [y-1,y - a[y]] // 防止重复更新,优化,假如已经更新到dis,(dis < y),那我就从dis更新,因为单调性,
		// 我先更新的,步数小
		d[i] = d[x] + 1;
		fa[i] = x;
		q.push(i);
		}
		dis = min(dis, y - a[y]);
	}

	puts("-1");
}	

signed main(){
	#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
	#endif

	sov();

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值