问题 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;
}
 
原文地址:https://www.cnblogs.com/lipu123/p/12344385.html