• 问题 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;
    }
     
  • 相关阅读:
    oracle数据库 SQL语句、内置函数大全
    oracle数据库常用关键字汇总!
    Java 统计一个项目中src下的所有 .java 文件的代码行数, 注释行数, 空行数
    java用流实现创建文件夹, 文件改名, 文件删除, 文件复制
    深度解析线程工作原理
    重要的几种流:文件流、缓冲流、转换流!
    Java中流的概念和递归算法
    针对集合类容器的归纳总结!
    Comparable、Iterator接口和Collections类的实现方法
    Map接口的一些常用方法
  • 原文地址:https://www.cnblogs.com/lipu123/p/12344385.html
Copyright © 2020-2023  润新知