呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第 i 层楼(1≤i≤N)上有一个数字 Ki (0≤Ki≤N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如: 3,3,1,2,5 代表了 Ki (K1=3,K2=3,……),从 1楼开始。在 1楼,按“上”可以到 4 楼,按“下”是不起作用的,因为没有 −2 楼。那么,从 A 楼 到 B 楼至少要按几次按钮呢?
1≤N≤200,1≤A,B≤N,0≤Ki≤N
输入格式:
第一行表示 N, A, B 第二行为 N 个用空格隔开的非负整数,表示 Ki
输出格式:
最少按键次数,若无法到达,则输出 -1
输入样例:
在这里给出一组输入。例如:
5 1 5
3 3 1 2 5
输出样例:
在这里给出相应的输出
例如:
3
代码
#include<bits/stdc++.h>
using namespace std;
const int N=210;
int n,a,b;
int d[N],e[N];
int bfs(int x){
queue<int>q;
q.push(x);
d[x]=0;//最短路程
while(q.size()){
int t=q.front();
q.pop();
if(t==b)return d[t];
if(t+e[t]>=1&&t+e[t]<=n){
int k=t+e[t];
if(d[k]==-1){
d[k]=d[t]+1;
q.push(k);
}
}
if(t-e[t]>=1&&t-e[t]<=n){
int k=t-e[t];
if(d[k]==-1){//没有被更新过
d[k]=d[t]+1;
q.push(k);
}
}
}
return -1;
}
int main(){
cin>>n>>a>>b;
for(int i=1;i<=n;i++){
cin>>e[i];
}
memset(d,-1,sizeof d);
cout<<bfs(a)<<endl;
return 0;
}