A strange lift(dfs)

题目

有一个奇怪的电梯。电梯可以随意停在每一层,每一层都有一个数字Ki(0 <= Ki <= N)。电梯只有两个按钮:上和下。当你在i层,按“UP”按钮,您将上Ki楼层,即,您将到达第i+Ki层,同样,如果您按下“DOWN”按钮,您将下降Ki 层,即,您将前往 i-Ki 层。当然,电梯上不能高过N,下不能低于1。比如有5层楼,k1=3,k2=3,k3=1,k4= 2, k5 = 5.从1楼开始,如果按“UP”按钮,可以上到4楼,如果按“DOWN”按钮,电梯不能做它,因为它不能下到-2楼,如你所知,
问题来了:当你在A楼,你想去B楼,他至少要按“UP”或“DOWN”按钮多少次?
输入
输入由几个测试用例组成,每个测试用例包含两行。
第一行包含上面描述的三个整数 N ,A,B( 1 <= N,A,B <= 200),第二行包含 N 个整数 k1,k2,…kn。
单个 0 表示输入结束。
输出
对于输入输出一个整数的每一种情况,你在A层时最少要按下按钮,并且你想要去B层。如果你不能到达B层,printf“-1”。
样本输入
5 1 5
3 3 1 2 5
0
样本输出
3
题意分析:
一个电梯,在每一层下降和上升的次数都是相同的,但是每一层的数值并不一样,现在要计算到达某一层需要的最少步数
解题思路:
从开始位置开始搜索,如果层数到达了,则记录步数,如果没到达,当电梯在此楼层继续上升会超过最高楼层时需要DOWN,反之一样

#include<iostream>
#include<cstring>
using namespace std;

int mp[210],book[201];
int n,a,b,ans;
void dfs(int x,int k)
{
	if(x==b)
	{
		ans=min(ans,k);
	}
	else if(k<=ans) 
	{
		book[x]=1;
		if(x+mp[x]<=n&&book[x+mp[x]]==0) dfs(x+mp[x],k+1);
		if(x-mp[x]>=1&&book[x-mp[x]]==0) dfs(x-mp[x],k+1);
		book[x]=0;
	}
}
int main()
{
	while(cin>>n)
	{
		ans=1e9;
		if(n==0) break;
		cin>>a>>b;
		memset(mp,0,sizeof(mp));
		memset(book,0,sizeof(book));
		for(int i=1; i<=n; i++)
			cin>>mp[i];	
		dfs(a,0);
		if(ans!=1e9)
		cout<<ans<<endl;
		else
		cout<<"-1"<<endl;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值