zoukankan      html  css  js  c++  java
  • 问题 B: 奇怪的电梯

    问题 B: 奇怪的电梯


    时间限制: 1 Sec  内存限制: 128 MB
    [命题人:admin]

    题目描述

    大楼的每一层楼都可以停电梯,而且第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。

    样例输入 Copy

    5 1 5
    3 3 1 2 5

    样例输出 Copy

    3
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<map> 
    #include <math.h>
    #include<bits/stdc++.h> 
    using namespace std;
    typedef long long ll; 
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    const int INF=0x3f3f3f3f;
    const int maxn=1e5+100;
    int n,en,be;
    int a[maxn];
    int ej[maxn];//摁键数 
    void inint(){
        cin>>n>>be>>en;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            ej[i]=-1; 
        }
        ej[be]=0;
    }
    int main(){
        inint();
        int p=0;
        int flag=1;
        while(ej[en]==-1&&flag){
            flag=0;
            for(int i=1;i<=n;i++){//每一次找可以转移的状态 
                if(ej[i]==p){//如第一次找p=0,第二次找p=1的 
                    int j=i+a[i];//如果flag=0说明不能到输出-1 
                    if(j<=n&&ej[j]==-1){
                        ej[j]=p+1;
                        flag=1;
                    }
                    j=i-a[i];
                    if(j>0&&ej[j]==-1){
                        ej[j]=p+1;
                        flag=1;
                    }
                }
            }
            p++;
        }
        printf("%d",ej[en]);
    }

    AC代码2:dfs

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<map> 
    #include <math.h>
    #include<bits/stdc++.h> 
    using namespace std;
    typedef long long ll; 
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    const int INF=0x3f3f3f3f;
    const int maxn=1e5+100;
    int n,m,k,s=INF;
    int a[maxn];
    int b[maxn];
    void inint(){
        cin>>n>>m>>k;
        for(int i=1;i<=n;i++){
            cin>>a[i];
        }
        b[m]=1;
    }
    void dfs(int now,int num){
        if(now==k){
            s=min(s,num);
        }
        else if(num<=s){
            b[now]=1;
            if(now+a[now]<=n&&b[now+a[now]]==0){
                dfs(now+a[now],num+1);
            }
            if(now-a[now]>=0&&b[now-a[now]]==0){
                dfs(now-a[now],num+1);
            }
            b[now]=0;
        }
    }
    int main(){
        inint();
        dfs(m,0);
        if(s==INF){
            printf("-1
    ");
        }
        else{
            printf("%d",s);
        }
        return 0;
    }
     
  • 相关阅读:
    break和continue
    while循环嵌套
    while循环语句
    SDUT 2766-小明传奇2(母函数)
    那些奇妙的&quot;大师&quot;是怎样炼成的(科学、迷信、心理)
    深入理解Linux字符设备驱动
    [从头学数学] 第162节 锐角三角函数
    iOS将数组中的内容分拼接成字符串
    win10 UWP 全屏
    杂(三)-The type java.lang.Object cannot be resolved It is indirectly referenced ...
  • 原文地址:https://www.cnblogs.com/lipu123/p/12344385.html
Copyright © 2011-2022 走看看