(深搜+剪枝)
1:(#1TLE)
#include<bits/stdc++.h>
using namespace std;
const int N=205;
int n,a,b,o=INT_MAX,aa[N];
bool vis[N];
void dfs(int p,int step){
if(p==b){
o=min(o,step);
return;
}
if(step>o)return;
if(p>n)return;
vis[p]=1;
if(p+aa[p]<=n&&!vis[p+aa[p]])dfs(p+aa[p],step+1);
if(p-aa[p]>=1&&!vis[p-aa[p]])dfs(p-aa[p],step+1);
vis[p]=0;
}
int main(){
cin>>n>>a>>b;
for(int i=1;i<=n;i++){
cin>>aa[i];
}
vis[a]=1;
dfs(a,0);
if(o!=INT_MAX)cout<<o;
else cout<<-1;
return 0;
}
2(#2 40%WA)