广度优先搜索。
注意判断a==b的情况
#include<cstdio>
#include<cstring>
int bfs(int* floor,int n,int a,int b)
{
int step[n+1];
int queue[500];
bool visit[n+1];
memset(visit,0,sizeof(visit));
memset(visit,0,sizeof(step));
int front=0,rear=-1;
queue[++rear]=a;
step[a]=0;
while(front<=rear)
{
int temp=queue[front++];
int next_up=temp+floor[temp];
int next_down=temp-floor[temp];
if(next_up>=1&&next_up<=n&&visit[next_up]==0)
{
queue[++rear]=next_up;
visit[next_up]=1;
step[next_up]=step[temp]+1;
if(next_up==b) return step[next_up];
}
if(next_down>=1&&next_down<=n&&visit[next_down]==0)
{
queue[++rear]=next_down;
visit[next_down]=1;
step[next_down]=step[temp]+1;
if(next_down==b) return step[next_down];
}
}
return -1;
}
int main()
{
int n,a,b;
while(scanf("%d",&n)!=EOF&&n)
{
scanf("%d%d",&a,&b);
int floor[n+1];
for(int i=1;i<=n;i++)
scanf("%d",&floor[i]);
if(a==b) printf("0\n");
else printf("%d\n",bfs(floor,n,a,b));
}
return 0;
}