代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=202;
int k[N],vis[N]; //k表示每层电梯上的数字;vis:标记数组;
int n,a,b,res=-1; //res表示结果;
struct node{
int floor,step; //floor:当前位于第几层;step:从a层到达该层需要按的电梯次数;
};
int f[]={-1,1}; //-1:向下;1:向上;
queue<node> q;
void bfs();
int main(){
scanf("%d %d %d",&n,&a,&b);
for(int i=1;i<=n;i++){
scanf("%d",&k[i]);
}
bfs();
printf("%d\n",res);
return 0;
}
void bfs(){
//先判断起点和终点是否重合。
if(a==b){
res=0;
return;
}
vis[a]=1;
node nod={a,0};
q.push(nod);
while(!q.empty()){
nod=q.front();
q.pop();
int floor=nod.floor;
int step=nod.step;
for(int i=0;i<=1;i++){
int nf=floor+(k[floor]*f[i]);
if(nf<1 || nf>n){
continue;
}
if(vis[nf]){
continue;
}
if(nf==b){
res=step+1;
return;
}
vis[nf]=1;
node nnod={nf,step+1};
q.push(nnod);
}
}
}