题目描述
呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第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。
输入输出样例
输入样例#1:
LIFT.IN 5 1 5 3 3 1 2 5
输出样例#1:
LIFT.OUT 3
为什么放在递推题集里面啊?这不是无脑BFS吗?
1 /**/ 2 #include<iostream> 3 #include<cstdio> 4 #include<cmath> 5 #include<cstring> 6 #include<algorithm> 7 using namespace std; 8 const int mxn=300; 9 int k[mxn]; 10 int q[655360],hd,tl; 11 int s[655360]; 12 int vis[mxn]; 13 int n,a,b; 14 void BFS(){ 15 hd=0;tl=1; 16 q[++hd]=a; 17 while(hd<=tl){ 18 int u=q[hd]; 19 if(u==b){ 20 printf("%d ",s[hd]); 21 return; 22 } 23 if(u+k[u]<=n && !vis[u+k[u]]){ 24 q[++tl]=u+k[u]; 25 s[tl]=s[hd]+1; 26 vis[u+k[u]]=1; 27 } 28 if(u-k[u]>0 && !vis[u-k[u]]){ 29 q[++tl]=u-k[u]; 30 s[tl]=s[hd]+1; 31 vis[u-k[u]]=1; 32 } 33 hd++; 34 } 35 printf("-1 "); 36 return; 37 } 38 int main(){ 39 scanf("%d%d%d",&n,&a,&b); 40 int i,j; 41 for(i=1;i<=n;i++)scanf("%d",&k[i]); 42 if(a==b)printf("0 "); 43 else BFS(); 44 return 0; 45 }