1360:奇怪的电梯(lift)时间限制: 1000 ms 内存限制: 65536 KB 提交数: 17358 通过数: 8142 【题目描述】大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)(1≤�≤�)上有一个数字Ki(0≤=Ki≤=N)��(0≤=��≤=�)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如: 【输入】共有二行,第一行为三个用空格隔开的正整数,表示N,A,B(1≤N≤200,1≤A,B≤N)�,�,�(1≤�≤200,1≤�,�≤�),第二行为N�个用空格隔开的正整数,表示Ki��。 【输出】一行,即最少按键次数,若无法到达,则输出−1−1。 【输入样例】5 1 5
3 3 1 2 5 【输出样例】3
|
#include<bits/stdc++.h>
using namespace std;
int n,x,y;
int a[205],vis[205];
struct st{
int id;
int step;
}s,w;
queue<st> q;
int flag=0;
void bfs(int id,int step){
s.id=id;
s.step=step;
q.push(s);
vis[id]=1;
while(!q.empty()){
s=q.front();
if(s.id==y){
cout<<s.step<<endl;
flag=1;
return;
}
q.pop();int t=s.id+a[s.id];
if(t<=n&&vis[t]==0){
w.id=t;
w.step=s.step+1;
vis[t]=1;
q.push(w);
}
t=s.id-a[s.id];
if(t>=1&&vis[t]==0){
vis[t]=1;
w.id=t;
w.step=s.step+1;
q.push(w);
}
}
}
int main(){
cin>>n>>x>>y;
for(int i=1;i<=n;i++) cin>>a[i];
if(x==y){
cout<<"0"<<endl;
return 0;
}
bfs(x,0);
if(flag==0){
cout<<-1;
}
return 0;
}