【题目描述】大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)上有一个数字Ki(0≤=Ki≤=N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如: 【输入】共有二行,第一行为三个用空格隔开的正整数,表示N,A,B(1≤N≤200,1≤A,B≤N),第二行为N个用空格隔开的正整数,表示Ki。 【输出】一行,即最少按键次数,若无法到达,则输出−1。 【输入样例】5 1 5 3 3 1 2 5 【输出样例】3 |
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <map>
#include <set>
#include <queue>
#include <stack>
#define sf(a) scanf("%d\n",&a)
#define pf(a) printf("%.2lf\n",a)
#define pi acos(-1.0)
#define E 1e-8
#define ms(a) memset(a,0,sizeof a)
#define rep(a,b,c) for(int a=b;a<=c;a++)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const int idata=200+5;struct node
{int floor;int count;
};
//ll i,j,k;
int judge,flag;
int step[idata];
bool vis[idata];
int n,m,t,ans;
int maxx=0,minn=inf;
int cnt,len,sum;
//map<ll,int>pre[2];
string s;
//priority_queue<ll, vector<ll>,less<ll> >q;
queue<node>q;
const int delta[4][2]={{1,0},{0,1},{-1,0},{0,-1}};int main()
{int start,last;while(cin>>n>>start>>last){rep(i,1,n){cin>>step[i];}node button,temp;button.floor=start;button.count=0;vis[start]=1;q.push(button);while(!q.empty()){temp=q.front();q.pop();if(temp.floor==last) break;int x=temp.floor+step[temp.floor];if(x<=n && !vis[x]){button.floor=x;button.count=temp.count+1;q.push(button);vis[x]=1;}x=temp.floor-step[temp.floor];if(x>=1 && !vis[x]){button.floor=x;button.count=temp.count+1;q.push(button);vis[x]=1;}}if(temp.floor==last) cout<<temp.count<<endl;else puts("-1");}return 0;
}