有一个奇怪的升降机。升降机可以根据需要停在每个楼层,每层都有一个Ki(0 <= Ki <= N)。电梯只有两个按钮:上下。当你在楼层i,如果你按下“UP”按钮,你会上升Ki楼层,即你会去i + Ki楼层,如果你按下“DOWN”按钮,你会下去Ki楼,即您将前往i-Ki楼层。当然,升力不能高于N,并且不能低于1.例如,有5层的建筑物,k1 = 3,k2 = 3,k3 = 1,k4 = 2,k5 = 5.从1楼开始,你可以按下“UP”按钮,你就到了4楼,如果你按下“DOWN”按钮,电梯就不能做它,因为它不能下到-2楼,如你所知,
问题出在这里:当你在A楼,你想要去B楼时,至少他必须按下“UP”或“DOWN”按钮多少次?
输入格式:输入包含几个测试用例。每个测试用例包含两行。
第一行包含三个整数N,A,B(1 <= N,A,B <= 200),如上所述,第二行包括N个整数k1,k2,...... kn。
单个0表示输入结束。
输出格式:
对于输入输出的每个情况一个整数,当你在A楼时你必须按下按钮的次数最少,而你想要去B楼。如果你不能到达B楼,则打印“-1”。
样例输入1:
5 1 5
3 3 1 2 5
0
样例输出1:
3
我的代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
int x,step;
};
signed main(){
int n,a,b;
while(cin>>n){
if(n==0)return 0;
cin>>a>>b;
int k[n+1],vis[n+1];
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)cin>>k[i];
queue<node> q;
q.push(node{a,0});
bool flag=false;
while(!q.empty()){
node t=q.front();
q.pop();
if(k[t.x]+t.x<=b and vis[t.x+k[t.x]]==0){
vis[t.x+k[t.x]]=1;
if(k[t.x]+t.x==b){
cout<<t.step+1<<endl;
flag=true;
break;
}q.push(node{t.x+k[t.x],t.step+1});
}if(t.x-k[t.x]>=1 and vis[t.x-k[t.x]]==0){
vis[t.x-k[t.x]]=1;
if(t.x-k[t.x]==b){
cout<<t.step+1<<endl;
flag=true;
break;
}q.push(node{t.x-k[t.x],t.step+1});
}
}
if(flag==false)cout<<-1<<endl;
}
return 0;
}
只有十分,求调。