#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stdio.h>
using namespace std;
const int N=210;
int head[N],e[N],ne[N],idx=0;//存着每个点可以到达的地方 idx就是没什么用的
int n,A,B;
bool ju[N];
//直接用图搜就行 从A开始搜到B
void add(int a,int b)//创建邻接链表 我透head表示的是头节点的下标
{
//向以a为为头的链表插head 表示
e[idx]=b;//就是头插啊
ne[idx]=head[a];
head[a]=idx++;
}
int dfs (int a,int b)
{
int sum=0;
int i;
if(a==b) return 0;
queue <int> q;
q.push(a);
ju[a]=true;
while(q.size())
{
int j=q.front();
q.pop();
for(i=head[j];i!=-1;i=ne[i])//下标用ne来表示 从头节点开始遍历
{
if(!ju[e[i]])
{
ju[e[i]]=true;
sum++;
if(e[i]==b)break;
q.push(e[i]);
}
}
}
if(e[i]!=b) return -1;
else return sum;
}
int main()
{ int num;
memset(head, -1, sizeof head);
memset(ju, false,sizeof ju);
scanf("%d %d %d",&n,&A,&B);//从A楼到b楼 直接从A开始(不是一定要从1l开始) 再搜下一次 两次bfs 第一次先搜到上楼的最短路 第二次从这开始搜
for(int i=1;i<=n;i++)//每一楼可以到大地点
{
cin>>num;
if(i+num<=n) add(i,i+num);
if(i-num>0) add(i,i-num);
}
cout<<dfs(A,B)<<endl;
// cout<<idx;
system("pause");
return 0;
}```