奇怪的电梯
题目
大楼的每一层楼都可以停电梯,而且第\(i\)层楼(\(1\)\(\leq\)\(i\)\(\leq\)\(N\))上有一个数字 \(K_i\)(\(0\)\(\leq\)\(K_i\)\(\leq\)\(N\)) 。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如: \(3,3,1,2,5\) 代表了 \(K_i(K_1=3,K_2=3,…)\) ,从 \(1\) 楼开始。在 \(1\) 楼,按“上”可以到 \(4\) 楼,按“下”是不起作用的,因为没有 \(−2\) 楼。那么,从 \(A\) 楼到 \(B\) 楼至少要按几次按钮呢?
代码
#include<bits/stdc++.h>
const int Max=250;
using namespace std;
int f[Max],a[Max],n,p,b;
bool tf[Max];
queue<int>q;
void bfs(){
tf[p]=true;
f[p]=0;
q.push(p);
while(q.size()>0){
int u=q.front();q.pop();
int v=u-a[u];
if(v>=1 && !tf[v]){
tf[v]=true;
f[v]=f[u]+1;
q.push(v);
}
v=u+a[u];
if(v<=n && !tf[v]){
tf[v]=true;
f[v]=f[u]+1;
q.push(v);
}
}
if(tf[b]) cout<<f[b];else cout<<-1;
}
int main()
{
cin>>n>>p>>b;
for(int i=1;i<=n;i++) cin>>a[i];
bfs();
return 0;
}