奇怪的电梯

bfs

#include"bits/stdc++.h"

using namespace std;
int n,a,b;
int s[205],v[205];
struct node{
	int x,y,step;
};
int bfs(int x){
	queue<node>q;
	q.push({x,s[x],0});
	v[x]=1;
	int f=0;
	while(!q.empty())
	{
		int u = q.front().x;
		int u1 = q.front().y;
		int u2 = q.front().step;
		q.pop();
		v[u]=1;
		if(u == b){
			f=1;
		    return u2;
		}
        if(u + u1 <= n && !v[u + u1]){
            v[u + u1] = 1;
            q.push({u+u1,s[u+u1],u2+=1});
        }
        if(u - u1 >=1 && !v[u - u1]){
            v[u - u1] = 1;
            q.push({u-u1,s[u-u1],u2+=1});
        }
	}
	if(!f)	return -1;
}
int main()
{
	cin >> n >> a >> b;
	for(int i=1 ; i<=n ; i++) cin >> s[i];
	cout << bfs(a) << endl;
	return 0;
}

dfs(这是看一位大佬,看懂了写出来)


#include"bits/stdc++.h"

using namespace std;
int s[205],v[205],f=999999;
int n,a,b;
void dfs(int x, int cnt){
	if(x == b){
		f = min(f,cnt);
	}else if(cnt <= f){		// 剪枝
		v[x] = 1;
		if(x + s[x] <=n && !v[x+s[x]]) dfs(x+s[x],cnt+1);//上升
		if(x - s[x] >=1 && !v[x-s[x]]) dfs(x-s[x],cnt+1);//下降
		v[x] = 0;	//回溯  核心 
	}
}
int main()
{
	cin >> n >> a >> b;
	for(int i=1;i<=n;i++) cin >> s[i];
	dfs(a,0);
	if(f == 999999) cout << -1 << endl;	
	else cout << f << endl;
	return 0;
 } 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值