zoukankan      html  css  js  c++  java
  • TYVJ P3522 &&洛谷 P1135 奇怪的电梯 Label:bfs

    题目描述

    呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第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

     代码

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<queue>
     6 #include<vector>
     7 using namespace std;
     8 struct cc{
     9     int num,step;
    10 };
    11 
    12 cc make_cc(int num,int step){
    13     cc a;
    14     a.num=num;a.step=step;
    15     return a;
    16 }
    17 
    18 int a[100005],vis[100005],N,A,B,cnt;
    19 queue<cc> que;
    20 int main(){
    21 //    freopen("01.in","r",stdin);
    22 //    freopen("01.out","w",stdout);
    23 
    24     scanf("%d%d%d",&N,&A,&B);
    25     for(int i=1;i<=N;i++){
    26         scanf("%d",&a[i]);
    27     }
    28 
    29     que.push(make_cc(A,0));
    30     vis[A]=1;
    31     while(!que.empty()){
    32         cc tmp=que.front();que.pop();
    33         
    34         if(tmp.num==B){
    35             printf("%d
    ",tmp.step);
    36             return 0;
    37         }
    38         
    39         int low=tmp.num-a[tmp.num],high=tmp.num+a[tmp.num];
    40         
    41         if(low>=1 && !vis[low]){
    42             que.push(make_cc(low,tmp.step+1));vis[low]=1;
    43         }
    44         if(high<=N && !vis[high]){
    45             que.push(make_cc(high,tmp.step+1));vis[high]=1;
    46         }
    47     }
    48     
    49     puts("-1");
    50     
    51 //    fclose(stdin);
    52 //    fclose(stdout);
    53     return 0;
    54 }
    正解
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<queue>
     6 #include<vector>
     7 using namespace std;
     8 int a[100005],vis[100005],N,A,B,cnt;
     9 queue<int> que;
    10 int main(){
    11 //    freopen("01.in","r",stdin);
    12 //    freopen("01.out","w",stdout);
    13 
    14     scanf("%d%d%d",&N,&A,&B);
    15     for(int i=1;i<=N;i++){
    16         scanf("%d",&a[i]);
    17     }
    18 
    19     que.push(A);
    20     vis[A]=1;
    21     while(!que.empty()){
    22         int tmp=que.front();que.pop();
    23         int low=tmp-a[tmp],high=tmp+a[tmp];
    24         
    25         if(tmp==B){
    26             printf("%d
    ",cnt);
    27             return 0;
    28         }
    29         
    30         if(low>0&&!vis[low]){
    31             que.push(low);vis[low]=1;
    32         }
    33         if(high<=N&&!vis[high]){
    34             que.push(high);vis[high]=1;
    35         }
    36         cnt++;
    37     }
    38     
    39     puts("-1");
    40     
    41 //    fclose(stdin);
    42 //    fclose(stdout);
    43     return 0;
    44 }
    错误代码

    错误代码是没有考虑到cnt可能不符合当前的步数

    因为没理解好bfs导致错误,cnt一直增加,而步数是随bfs深度增加的

    版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
  • 相关阅读:
    Asynchttpclient开源框架下载图片和文本,于Volley和Glide开源框架的区别。
    探究Python迭代器与生成器
    Python核心编程第二版 第十一章课后答案
    Python核心编程第二版 第十章课后答案
    Python核心编程第二版 第九章课后答案
    Python核心编程第二版 第八章课后答案
    Python核心编程第二版 第七章课后答案
    Python strip()方法介绍
    Python核心编程第二版 第六章课后练习
    Python中列表元素转为数字的方法
  • 原文地址:https://www.cnblogs.com/radiumlrb/p/5835818.html
Copyright © 2011-2022 走看看