题目描述
青牛做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且每层楼上有一个数字。电梯只有两个按钮:上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:一共有7楼,每层楼的数字是3,1,2,2,2,4,1,从1楼开始。在1楼,按“上”可以到4楼,按“下”是不起作用的,因为没有-2楼。那么,从A楼到B楼至少要按几次按钮呢?
输入描述
共二行。
第一行为3个用空格隔开的正整数,表示N,A,B(1≤N≤200,1≤A,B≤N)。
第二行为N个用空格隔开的非负整数,表示Ki。
输出描述
一行,即最少按键次数,若无法到达,则输出−1。
#include<bits/stdc++.h>
using namespace std;
int a,b,x[500]/*电梯上的数字*/;
bool vis[500];
int q,p; //头、尾指针
int N;
struct node
{
int floor,dep;
}Q[1000];
int bfs() //广搜
{
if(a==b) return 0; //如果开始层等于结束层,直接返回0步
int ans,top,k;
Q[1]={a,0};
q=1;p=2;
while(q<p)
{
top=Q[q].floor;ans=Q[q].dep;
for(int i=-1;i<=1;i+=2)
{
k=top+x[top]*i;
if (k>=1&&k<=N&&!vis[k])
{
vis[k]=true;
if(k==b) return ans+1; //到达终点,返回答案
Q[p]={k,ans+1}; //入队列
p++;
}
}
q++;
}
return -1;
}
int main()
{
cin>>N>>a>>b;
for(int i=1;i<=N;i++) cin>>x[i];
cout<<bfs();
return 0;
}
标签:数字,int,电梯,个用,按钮,奇怪,500
From: https://blog.csdn.net/vehiclevjv/article/details/145169622