/*题目意思:有一个电梯,在第i层时,可以向上a[i]层,或向下a[i]层。
现在,给出你的初始位置,和终点位置问你最少操作几次可以到达,假设
无法到达输出“-1”。
思路:用bfs从起点开始存入队列开始搜,假设下一个点没有走过而且在
1~n层之间,则压入队列。符合条件则输出步数。
代码:*/
#include<iostream>
#include<stdio.h>
#include<queue>
#include<algorithm>
using namespace std;
int n,s,d,a[10085],vis[1005];//vis[]标记是否走过
struct ww
{
int num;
int step;
}p1,p2;//用结构体记住位置和步数
int bfs()
{
memset(vis,0,sizeof(vis));
queue<ww>q;
p1.num =s;
p1.step =0;
q.push(p1);
vis[p1.num]=1;//起点压入队列
while(!q.empty())
{
p2=q.front ();
q.pop();
if(p2.num==d)//出口
return p2.step ;
//向上时
if(p2.num+a[p2.num]<=n&&!vis[p2.num+a[p2.num]])
{
//满足条件则步数加1,更新位置,压入队列,并标记
p1.step=p2.step+1;
p1.num =p2.num+a[p2.num];
q.push(p1);
vis[p2.num+a[p2.num]]=1;
}
//向下时
if(p2.num-a[p2.num]>=1&&!vis[p2.num-a[p2.num]])
{
p1.step=p2.step+1;
p1.num =p2.num-a[p2.num];
q.push(p1);
vis[p2.num-a[p2.num]]=1;
}
}
return -1;//假设队列已空还没找到满足条件,则说明无法达到终点
}
int main ()
{
int i,j;
while(~scanf("%d%d%d",&n,&s,&d))//c++输入78毫秒,scanf只要0秒
{
if(n==0)
break;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int t=bfs();
cout<<t<<endl;
}
return 0;
}