1.6.2 奇怪的电梯(BFS)

举报
irrational 发表于 2022/01/17 23:28:27 2022/01/17
【摘要】 Description 有一天uncle-lu做了一个梦,梦见了一种很奇怪的电梯。 大楼的每一层楼都可以停电梯,而且i层楼上有一个数字。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。 当然,如果不能满足要求,相应的按钮就会失灵。例如:3,3,1,2,5代表了,从1楼开始。在1楼,按“上”可以到4楼,按“...

Description

有一天uncle-lu做了一个梦,梦见了一种很奇怪的电梯。
大楼的每一层楼都可以停电梯,而且i层楼上有一个数字。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。
当然,如果不能满足要求,相应的按钮就会失灵。例如:3,3,1,2,5代表了,从1楼开始。在1楼,按“上”可以到4楼,按“下”是不起作用的,因为没有−2楼。
那么,从A楼到B楼至少要按几次按钮呢?

Input

第一行为333个用空格隔开的正整数,表示N,A,B

第二行为N个用空格隔开的非负整数,表示Ki。

Output

一行,即最少按键次数,若无法到达,则输出−1-1−1。

Sample Input 1

5 1 5
3 3 1 2 5

Sample Output 1

3

Hint

1≤N≤200,1≤A,B≤N


  
  1. #include <cstring>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <queue>
  5. using namespace std;
  6. int h[210];
  7. typedef pair<int, int> PII;
  8. const int N = 2000000;
  9. int n,a,b;
  10. int d[N];
  11. inline int bfs()
  12. {
  13. queue<int> q;
  14. memset(d, -1, sizeof d);
  15. d[a] = 0;
  16. q.push(a);
  17. while (q.size())
  18. {
  19. auto t = q.front();
  20. //cout<<t<<endl;
  21. q.pop();
  22. for (int i = 0; i <= 1; i ++ )
  23. {
  24. int y;
  25. if(i) y=t+h[t];
  26. else y=t-h[t];
  27. if (y<=0||y>b)continue;
  28. if (d[y] == -1)
  29. {
  30. d[y] = d[t] + 1;
  31. q.push(y);
  32. }
  33. }
  34. }
  35. return d[b];
  36. }
  37. int main()
  38. {
  39. cin >> n >> a >> b;
  40. for (int i = 1; i <= n; i ++ )
  41. scanf("%d", &h[i]);
  42. cout << bfs() << endl;
  43. return 0;
  44. }

  
  1. #include<cstdio>
  2. int n,st,ed,p=0;
  3. int step[210],lift[210];
  4. bool pd=true;
  5. int main()
  6. {
  7. scanf("%d %d %d",&n,&st,&ed);
  8. for(int i=1;i<=n;i++)
  9. {
  10. step[i]=-1;
  11. scanf("%d",&lift[i]);
  12. }
  13. step[st]=0;
  14. while(step[ed]==-1 && pd)
  15. {
  16. pd=false;
  17. for(int i=1;i<=n;i++)
  18. if(step[i]==p)
  19. {
  20. int j=i+lift[i];
  21. if(j<=n && step[j]==-1)
  22. {
  23. step[j]=p+1;
  24. pd=true;
  25. }
  26. j=i-lift[i];
  27. if(j>0 && step[j]==-1)
  28. {
  29. step[j]=p+1;
  30. pd=true;
  31. }
  32. }
  33. p++;
  34. }
  35. printf("%d",step[ed]);
  36. return 0;
  37. }

两种方法都可以

文章来源: blog.csdn.net,作者:irrationality,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_54227557/article/details/120606159

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。