天天看点

hdu1548

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;

int s[205];
int vis[205];
int n,a,b;

struct node{
	int x;//当前层数 
	int step;//按的次数 
};

int bfs(){
	queue<node>q;
	node c,next;
	c.x=a;
	c.step=0;
	vis[c.x]=1;
	int i;
	q.push(c);
	while(!q.empty()){
		c=q.front();
		q.pop();
		if(c.x==b)return c.step;
		next=c;
		next.x=next.x+s[next.x];
		if((vis[next.x]==0)&&(next.x>0)&&(next.x<=n)){
			vis[next.x]=1;
			next.step++;
			q.push(next);
		}
		next=c;
		next.x=next.x-s[next.x];
		if((vis[next.x]==0)&&(next.x>0)&&(next.x<=n)){
			vis[next.x]=1;
			next.step++;
			q.push(next);
		}
	}
	return -1; 
}
int main(){
	while(scanf("%d",&n)!=EOF){
		if(n==0)break;
		scanf("%d%d",&a,&b);
		int i;
		memset(vis,0,sizeof(vis));
		for(i=1;i<=n;i++){
			scanf("%d",&s[i]);
		}
		printf("%d\n",bfs());
	}
	return 0;
} 
           
bfs