思路:对两个可互相到达的楼层建边,跑最短路
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
const int N=2e2+5;
const int Inf=1e9;
typedef pair<int,int> P;
vector<P> vec[N];
inline void add(int x,int y){
vec[x].push_back(P(1,y));
}
int Dijstra(int u,int v,int n){
int dis[N],vis[N];
for(int i=1;i<=n;i+=1){
dis[i]=Inf;
vis[i]=false;
}
dis[u]=0;
priority_queue<P,vector<P>,greater<P> >que;
que.push(P(0,u));
while(!que.empty()){
int x=que.top().second;
que.pop();
if(vis[x]) continue;
vis[x]=1;
for(auto e:vec[x]){
int to=e.second;
int di=e.first;
if(dis[to]>dis[x]+di){
dis[to]=dis[x]+di;
que.push(P(dis[to],to));
}
}
}
return dis[v]!=Inf?dis[v]:-1;
}
int f[N];
int main(){
int n,A,B;
while(~scanf("%d",&n)){
if(!n) break;
scanf("%d%d",&A,&B);
for(int i=1;i<=n;i+=1){
scanf("%d",&f[i]);
vec[i].clear();
}
for(int i=1;i<=n;i+=1){
if(!f[i]) continue;
if(i+f[i]<=n) add(i,i+f[i]);
if(i-f[i]>=1) add(i,i-f[i]);
}
printf("%d\n",Dijstra(A,B,n));
}
return 0;
}