https://vjudge.net/contest/286102#problem/B
///DFS
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
int N,A,B;
int ans=0;
int vis[1000];
int k[220];
int flag;
int book[1000];
const int inf=0x3f3f3f3f;
void Dfs(int x,int step)
{
if(x==B)
{
if(ans>step)
{
ans=step;
return;
}
}
if(step>=vis[x])return;//剪枝,很重要,否则会超时
vis[x]=step;
int a=x+k[x];
int b=x-k[x];
if(a<=N)
{
Dfs(a,step+1);
}
if(b>0)
{
Dfs(b,step+1);
}
}
int main()
{
while(~scanf("%d",&N))
{
if(N==0)
break;
memset(vis,inf,sizeof(vis));
scanf("%d%d",&A,&B);
for(int i=1; i<=N; i++)
scanf("%d",&k[i]);
ans=inf;
flag=0;
Dfs(A,0);
if(ans!=inf)
printf("%d\n",ans);
else
printf("-1\n");
}
}
///Bfs
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
struct node
{
int x;
int step;//记录步数
};
queue<node>q;
int k[220];
int vis[220];
int N,A,B;
int ans=0;
int bfs(node &s)
{
q.push(s);
while(!q.empty())
{
node f=q.front();
q.pop();
if(f.x==B)
return f.step;
node n,m;
n.x=f.x+k[f.x];
m.x=f.x-k[f.x];
if(!vis[n.x]&&n.x<=N)
{
vis[n.x]=1;
n.step=f.step+1;
q.push(n);
}
if(!vis[m.x]&&m.x>0)
{
vis[m.x]=1;
m.step=f.step+1;
q.push(m);
}
}
return -1;
}
int main()
{
while(~scanf("%d",&N))
{
if(N==0)
{
break;
}
scanf("%d%d",&A,&B);
memset(vis,0,sizeof(vis));
for(int i=1; i<=N; i++)
{
scanf("%d",&k[i]);
}
while(!q.empty())//清空,很重要
q.pop();
node r;
r.x=A;
r.step=0;
vis[r.x]=1;
printf("%d\n",bfs(r));
}
return 0;
}