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