luogu P1135 奇怪的电梯

https://www.luogu.org/problem/P1135

题目描述

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

输入格式

共二行。

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

第二行为N个用空格隔开的非负整数,表示 K i K_i Ki

输出格式

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

输入输出样例

输入 #1

5 1 5
3 3 1 2 5

输出 #1

3

代码

#include<cstdio>
#include<iostream>
using namespace std;

int n,st,ed,p=0,i,j;

//st    start    开始
//ed    end      结束

int step[210],lift[210];
//step    步数    到第i层已经按了多少次?
//lift    电梯    第i层的按键显示是多少?

bool pd=true;//pd=true    能走 否则不能走
int main()
{
    scanf("%d %d %d",&n,&st,&ed);
    for(i=1;i<=n;i++) 
    {
        step[i]=-1;
        //我在这里先将步数设成-1
        //-1表示没走过        
        scanf("%d",&lift[i]);
        //电梯可上(下)层数
    }
    step[st]=0;
    //开始步数为0
    while(step[ed]==-1 && pd)
    //当最后一层没有被访问过
    //pd在下面有解释 
    {
        pd=false;//先假设不能走了
        for(i=1;i<=n;i++)//一层一层模拟
            if(step[i]==p) //第一次p是0,step[st]开始运行 后面p的作用大了
            {
                j=i+lift[i];//模拟上楼
                if(j<=n && step[j]==-1)//没有超过n层楼并且没走过
                {
                    step[j]=p+1;//如果走这里那么下一次就找这层 
                    pd=true;//能走 如果不能走的话就下一层for 假设死循环则pd=false,跳出while 
                }
                
                j=i-lift[i];//模拟下楼 
                if(j>0 && step[j]==-1)//没有到地下并且没走过
                {
                    step[j]=p+1;
                    pd=true;//同上楼的做法
                }
            }
        p++;//下一层 
    }
    printf("%d",step[ed]);//没走过的话step[ed]没发生变化 所以就还是-1 发生变化的话就输出步数
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值