题目描述
有一天桐桐做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)上有一个数字K;(0≤Ki≤N)。电梯只有四 个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3 3 1 2 5代表了Ki (K1=3,K2=3,…),从一楼开始。在一楼,按“上,”可以到4楼,按“下”是不起作用的,因为没有-2楼。那么,从A楼到B楼至少要按几次按钮 呢?
输入
第1行为三个正整数,表示N,A,B(1≤N≤200,1≤A,B≤N);
第2行为N个正整数,表示Ki。
输出
1行,即最少按键次数,若无法到达,则输出-1。
样例输入
5 1 5
3 3 1 2 5
样例输出
3
思路:标准dfs题,从起点开始搜索,每次判断能否下楼或上楼,最后输出最少步数
附代码:
#include<iostream>
using namespace std;
int n,a,b,i,ans=1e6,f[10001],book[10001];
void dfs(int x,int step)
{
if(x==b)
{
if(step<ans) ans=step;
return;
}
if(step>ans) return;
book[x]=true;
if(book[x+f[x]]==false) dfs(x+f[x],step+1);
if(x-f[x]>=1&&book[x-f[x]]==false) dfs(x-f[x],step+1);
book[x]=false;
}
int main()
{
cin>>n>>a>>b;
for(i=1;i<=n;i++) cin>>f[i];
book[a]=1;
dfs(a,0);
if(ans==1e6) cout<<-1;else cout<<ans;//不要忘记无法到达的情况!!!
}