奇怪的电梯(lift)
链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1360时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3 3 1 2 5代表了Ki(K1=3,K2=3,……),从一楼开始。在一楼,按“上”可以到4楼,按“下”是不起作用的,因为没有-2楼。那么,从A楼到B楼至少要按几次按钮呢?
【输入】
共有二行,第一行为三个用空格隔开的正整数,表示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<cstring> #include<cstdio> #include<queue> using namespace std; int a[205],c[205]; bool b[205]; //int zl[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int N,A,B; queue <int>Q; int bfs() { Q.push(A); b[A]=1; while(!Q.empty()) { int u=Q.front(); Q.pop(); int x=u+a[u],y=u-a[u]; if(x>0&&x<=N&&!b[x]) { b[x]=1;Q.push(x);c[x]=c[u]+1; } if(y>0&&y<=N&&!b[y]) { b[y]=1;Q.push(y);c[y]=c[u]+1; } if(b[B])return 1; } return 0; } int main() { cin>>N>>A>>B; for(int i=1;i<=N;i++)cin>>a[i]; if(bfs())cout<<c[B]<<endl; else cout<<"-1"<<endl; }