首页 > 编程语言 >P1135 奇怪的电梯 JAVA题解

P1135 奇怪的电梯 JAVA题解

时间:2024-11-30 14:29:40浏览次数:8  
标签:java int 题解 电梯 new JAVA div poll P1135

题目描述

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

输入格式

共二行。

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

第二行为 NN 个用空格隔开的非负整数,表示 KiKi​。

输出格式

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

输入输出样例

输入 #1复制

5 1 5
3 3 1 2 5

输出 #1复制

3

说明/提示

对于 100%100% 的数据,1≤N≤2001≤N≤200,1≤A,B≤N1≤A,B≤N,0≤Ki≤N0≤Ki​≤N。

本题共 1616 个测试点,前 1515 个每个测试点 66 分,最后一个测试点 1010 分。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.LinkedList;
import java.util.Queue;

public class Main {
    static int min = Integer.MAX_VALUE, n, a, b;
    static int[] arr, div;//分别表示电梯按钮能上下的层数,和每层到达的最短步数

    static class Scanner {//自定义输入类,让输入的速度更快
        StreamTokenizer streamTokenizer = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));

        public int nextInt() throws IOException {
            streamTokenizer.nextToken();
            return (int) streamTokenizer.nval;
        }
    }

    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner();
        n = sc.nextInt();
        a = sc.nextInt();
        b = sc.nextInt();
        arr = new int[n + 1];
        div = new int[n + 1];
        for (int i = 1; i <= n; i++) {
            arr[i] = sc.nextInt();
            div[i]=-1;//到达第i层电梯所花费的步数,-1表示没有走过
        }
        min=bfs(a);
        System.out.println(min);
    }

    private static int bfs(int a) {
        div[a]=0;//初始电梯,由于一开始就在所以为0
        Queue<Integer> queue=new LinkedList<>();//java中常用的队列实现方式
        queue.add(a);//初始位置入队
        while (!queue.isEmpty()){//由于bfs第一次所到达的次数为最短,所以采用bfs
            Integer poll = queue.poll();//将上一次的位置出队
            int top=poll+arr[poll];//电梯向上
            int down=poll-arr[poll];//电梯向下
            if (top<=n&&div[top]==-1){//电梯向上,判断是否走过和超界,以免陷入死循环和报错
                div[top]=div[poll]+1;//将走过的电梯次数作为标志,而且下一次不能走
                queue.add(top);//可以走则加入对头
            }
            if (down>=1&&div[down]==-1){//电梯向下,判断是否走过和超界,以免陷入死循环和报错
                div[down]=div[poll]+1;//将走过的电梯次数作为标志,而且下一次不能走
                queue.add(down);//可以走则加入对头
            }
        }
        return div[b];//如果没有到达则div[b]的值为-1
    }
}

想把每一到没有java题解的题解出来分享,想把c++能写的题用java都写一遍,新人作者普通专升本二本,蓝桥杯也只拿过二等奖,不过还是希望在座的各位都能看懂,今年准备冲击蓝桥杯国奖,祝大家也能够参加算法大赛取得不错的成绩

标签:java,int,题解,电梯,new,JAVA,div,poll,P1135
From: https://blog.csdn.net/weixin_67289517/article/details/144154049

相关文章

  • P2658 汽车拉力比赛 JAVA题解
    package篮桥杯.d;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.StreamTokenizer;importjava.util.LinkedList;importjava.util.Queue;publicclassMain{//自定义的输入类,比普通Scanner快两......
  • Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
    背景事件:近日,优衣库宣布不再使用新疆棉花,这一举措引发了广泛的社会讨论。消费者的反应和舆论的压力,让优衣库的决策迅速影响了市场和品牌形象。类似的,许多系统也面临着需要根据外部事件或状态的变化,做出即时反应的需求。在软件设计中,观察者模式(ObserverPattern)就是为了处理这种......
  • 如何让Java的线程彼此同步?
    在Java中,线程同步是一个重要的概念,用于确保多个线程在访问共享资源时能够保持数据的一致性和正确性。Java提供了多种线程同步机制,以下是具体的同步方法:一、使用synchronized关键字synchronized同步方法:即在方法声明中使用synchronized关键字。当一个线程访问某个对象的synchr......
  • USB无法识别设备?USB驱动问题解析篇
    今天我们来讲解的是USB驱动问题,连接USB无法识别模组设备,是不是驱动问题?今天就一起来聊聊如何排查解决。注意:本文涉及的内容都是基于Windows系统,且不低于Win7版本;Linux/Mac/UNIX/低版本的Windows,不在本文涉及范围之内。一、哪些模组需要安装USB驱动可根据下方分类判断自己手中的......
  • 【无标题】JAVA策略模式代码例子
    在Java中,您可以使用面向对象编程中的继承和多态性来实现您的需求。首先,我们定义一个`Good`类,该类包含满减策略和打折策略。然后,我们可以让`Shoe`类和`Cloth`类继承自`Good`类。为了实现不同的折扣或满减策略,可以考虑使用策略模式。 下面是一个简单的实现示例: ###1.定义......
  • C# mvc +axios + web api + javascript
    2024年,是Insus.NET生命中转折的一年,许久没有更新博客了。许多网友在通讯或邮件私聊,希望在博客上更新内容,分享一些技能与通用的博文。 回归正题,在C#mvc使用javascriptaxios访问webapi。在mssqlserver创建数据表 存储过程... C#MVC程序与数据库交互,创建entity:上......
  • Atcoder Beginner Contest 330 题解
    前言过于水的一场。ACountingPasses题面给出一个长度为\(n\)的序列\(a\),求出\(a\)之中大于等于\(l\)的数个个数。\(1\len\le100,1\lea_i\le1000,1\lel\le1000\)。制約入力は全て整数$1\\le\N\\le\100$$1\\le\L\\le\1000$$0\\le\A_i\\le......
  • 婚纱摄影管理系统|Java|SSM|VUE| 前后端分离
    【重要1⃣️】前后端源码+万字文档+部署文档【重要2⃣️】正版源码有问题包售后【重要3⃣️】虚拟可复制品不支持退换货【重要3⃣️】虚拟可复制品不支持退换货【重要3⃣️】虚拟可复制品不支持退换货            【包含内容】【一】项目提供非常完整的源......
  • JavaEE进阶-----mybatis操作数据库(新手教程)
    文章目录1.创建项目2.mysql相关操作3.安装插件4.工程创建4.1Bean文件夹4.2Dao文件夹4.3xml文件内容解读4.4配置文件4.5测试文件1.创建项目我们创建项目的时候需要注意下面的这个内容:1)maven项目;2)选择配置:我们之前使用的这个lombok和这个web还是要继续选择的;与之前......
  • 学习javascript基础这一篇就够了(2024最新版)
    目录前言什么是JavaScript?BOM-浏览器对象模型DOM-文档对象模型JavaScript与Java的关系JavaScript与ECMAScript的关系JavaScript能做什么?前端领域后端领域APP桌面应用图形/游戏嵌入式与IOT开发为什么要学JavaScript?学习JavaScript所需要的的环境与设备......