首页 > 代码库 > 洛谷P1135 奇怪的电梯
洛谷P1135 奇怪的电梯
题目描述
呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第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.IN5 1 53 3 1 2 5
输出样例#1:
LIFT.OUT3
为什么放在递推题集里面啊?这不是无脑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\n",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\n");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\n");43 else BFS();44 return 0;45 }
洛谷P1135 奇怪的电梯
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。