• P1135 奇怪的电梯



     

    题目描述

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

    输入格式

    共二行。

    第一行为三个用空格隔开的正整数,表示N,A,B(1≤N≤200 1≤A,B≤N)。

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

    输出格式

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

    输入输出样例

    输入 #1复制

    5 1 5
    3 3 1 2 5
    

    输出 #1复制

    3
    

    说明/提示

    对于 100 \%100% 的数据,1 \le N \le 2001≤N≤200,1 \le A, B \le N1≤A,B≤N,0 \le K_i \le N0≤Ki​≤N。

    在洛谷,
    享受 Coding 的欢乐

    关于洛谷 帮助中心 用户协议 联系我们
    小黑屋 陶片放逐 社区规则 招贤纳才
    Developed by the Luogu Dev Team
    2013-2022 , © 洛谷
    增值电信业务经营许可证 沪B2-20200477
    沪ICP备18008322号 All rights reserved.

    两种,一种深搜,一种广搜

    深搜

    1. #include <iostream>
    2. #include <algorithm>
    3. #include <cstring>
    4. using namespace std;
    5. int n,a,b;
    6. int s[205],sum=10000000;
    7. bool f[205];
    8. void dfs(int x,int y) {
    9. if(x==b)
    10. sum= min(sum,y);
    11. if(y>sum)
    12. return;
    13. f[x]=1;
    14. if(x+s[x]<=n&&!f[x+s[x]]) dfs(x+s[x],y+1);
    15. if(x-s[x]>=1&&!f[x-s[x]]) dfs(x-s[x],y+1);
    16. f[x]=0;//回溯
    17. }
    18. int main(){
    19. scanf("%d%d%d",&n,&a,&b);
    20. for (int i = 1; i <=n ; ++i) {
    21. scanf("%d",&s[i]);
    22. }
    23. f[a]=1;
    24. dfs(a,0);
    25. if(sum!=10000000){
    26. printf("%d",sum);
    27. }
    28. else
    29. printf("-1");
    30. return 0;
    31. }

     

    1. #include <iostream>
    2. #include <algorithm>
    3. #include <cstring>
    4. #include <queue>
    5. using namespace std;
    6. int n,a,b;
    7. int s[205],sum=10000000;
    8. bool f[205];
    9. int step=0;
    10. void bfs(int u) {
    11. if(u==b){printf("0");return;}
    12. queue<pair<int,int>>q;
    13. q.push(make_pair(u,0));
    14. f[u]=1;
    15. while(!q.empty()){
    16. auto t=q.front();
    17. q.pop();
    18. int x=t.first+s[t.first],y=t.first-s[t.first];
    19. step=t.second+1;
    20. if(x==b||y==b){
    21. printf("%d", step);
    22. return ;
    23. }
    24. if(f[x]==0&&x<=n){
    25. q.push(make_pair(x,step));
    26. f[x]=1;
    27. }
    28. if(f[y]==0&&y>=1){
    29. q.push(make_pair(y,step));
    30. f[y]=1;
    31. }
    32. }
    33. printf("-1");
    34. return;
    35. }
    36. int main(){
    37. scanf("%d%d%d",&n,&a,&b);
    38. for (int i = 1; i <=n ; ++i) {
    39. scanf("%d",&s[i]);
    40. }
    41. bfs(a);
    42. return 0;
    43. }

     

  • 相关阅读:
    华为Mate 60难以撼动苹果的市场份额
    混淆电路的优化:P&P、Free XOR、GRR2
    蓝桥杯每日一题2023.11.15
    类加载器源码分析-双亲委派机制
    微信小程序疑难杂症---修改数组里的某个属性的值
    6、使用本地模拟器调试项目
    交流回馈老化测试负载的应用
    第2章 python入门的基础知识
    41. linux通过yum安装postgresql
    Linux 系统环境监测
  • 原文地址:https://blog.csdn.net/q619718/article/details/127643573