华为OD机试真题 Java 实现【跳格子游戏】【2023 B卷 200分】,附详细解题思路

news2024/11/24 16:18:01

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

地上共有N个格子,你需要调完地上所有的格子,但是格子间是有强依赖关系的,跳完前一个格子后,后续的格子才会被开启,格子间的依赖关系由多组steps数组给出,steps[0]表示前一个格子,step[1]表示steps[0]可以开启的格子。

比如[0,1]表示从跳完第0个格子以后第1个格子就开启了,比如[2,1],[2,3]表示跳完第2个格子后第1个格子和第3个格子就被开启了。

请你计算是否能由给出的steps数组跳完所有的格子,如果可以输出yes,否则输出no。

说明:

  • 你可以从一个格子调到任意一个开启的格子;
  • 没有前置依赖条件默认就是开启的;
  • 如果总数是N,则所有的格子编号为[0,1,2,3…N-1]l连续的数组

二、输入描述

第一行输入两个正整数,第一个整数N表示总共有多少个格子,第二个整数表示二维数组的大小M。

接下来的M行输入二维数组steps表示所有格子之间的依赖关系。

三、输出描述

如果能按照steps给定的依赖顺序跳完所有的格子输出yes,否则输出no。

四、解题思路

深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(n)。

  1. 输入N个格子,二维数组的大小M,通过java8 Stream表达式(简洁/方便/上档次)快速拆解输入行;
  2. 初始化边edgeLists;
  3. 遍历所有节点;
  4. 如果节点未被遍历,从该节点开始遍历;
    • 标记节点为正在遍历;
    • 遍历邻居节点;
      • 如果邻居节点未被遍历,递归遍历邻居节点,如果已经无法跳完所有格子,直接返回;
      • 如果邻居节点已被遍历但未完成遍历(即在当前遍历路径中),无法跳完所有格子,标志置为false;
    • 标记节点为遍历完成;
  5. 输出结果;

五、Java算法源码

package com.guor.od;

import java.util.*;

public class OdTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] line1 = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        // 输入N个格子
        int N = line1[0];
        // 二维数组的大小M
        int M = line1[1];

        // 初始化边
        List<List<Integer>> edgeLists = new ArrayList<>();
        for(int i = 0; i < N; i++) {
            edgeLists.add(new ArrayList<>());
        }
        List<statusEnum> statusList = new ArrayList<>(Collections.nCopies(N, statusEnum.UNVISITED));

        boolean[] stepArr = { true };

        for(int i = 0; i < M; i++) {
            int[] line2 = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
            int a = line2[0];
            int b = line2[1];
            // 记录边
            edgeLists.get(b).add(a);
        }

        // 遍历所有节点
        for(int i = 0; i < N && stepArr[0]; i++) {
            // 如果节点未被遍历
            if(statusList.get(i) == statusEnum.UNVISITED) {
                // 从该节点开始遍历
                dfs(i, statusList, edgeLists, stepArr);
            }
        }

        // 输出结果
        System.out.println(stepArr[0] ? "yes" : "no");
    }

    // 格子状态
    enum statusEnum { UNVISITED, VISITING, VISITED };

    /**
     * 深度优先搜索
     * @param node
     * @param statusList
     * @param edgeLists
     * @param stepAllGrids
     */
    public static void dfs(int node, List<statusEnum> statusList, List<List<Integer>> edgeLists, boolean[] stepAllGrids) {
        // 标记节点为正在遍历
        statusList.set(node, statusEnum.VISITING);

        // 遍历邻居节点
        for(int neighbor : edgeLists.get(node)) {
            // 如果邻居节点未被遍历
            if(statusList.get(neighbor) == statusEnum.UNVISITED) {
                // 递归遍历邻居节点
                dfs(neighbor, statusList, edgeLists, stepAllGrids);

                // 如果已经无法跳完所有格子,直接返回
                if(!stepAllGrids[0]) {
                    return;
                }
                // 如果邻居节点已被遍历但未完成遍历(即在当前遍历路径中)
            } else if(statusList.get(neighbor) == statusEnum.VISITING) {
                // 无法跳完所有格子,标志置为false
                stepAllGrids[0] = false;
                return;
            }
        }

        // 标记节点为遍历完成
        statusList.set(node, statusEnum.VISITED);
    }
}

六、效果展示

1、输入

3
0 1
0 2

2、输出

yes

3、说明

总共有三个格子[0,1,2],跳完0个格子后第一个格子就开启了,跳到第0个格子后第2个格子也被开启了,按照0->2->1 的顺序都可以跳完所有的格子。

在这里插入图片描述


🏆下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/865822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

进销存管理系统(小杨国贸)springboot采购仓库财务java jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 进销存管理系统&#xff08;小杨国贸&#xff09;spri…

SpringBoot 整合Swagger2

一、Swagger简介 Swagger是一套开源工具和规范&#xff0c;用于设计、构建和文档化RESTful Web服务。它允许开发人员定义API的各个方面&#xff0c;并生成易于理解的API文档和交互式API探索界面。同时&#xff0c;Swagger还提供代码生成工具&#xff0c;可自动生成与API交互的客…

公文撰写规范:提升文档质量和专业性

1.拼写和语法检查&#xff1a;仔细检查文档中的拼写错误和语法错误。确保单词的正确拼写&#xff0c;并使用正确的语法结构和标点符号。 2.信息准确性&#xff1a;核对文档中的事实和数据&#xff0c;确保其准确性。确认所有日期、数字和引用的信息是否准确无误。 3.文档结构和…

控制国外各类电液伺服阀放大器

控制通用型不带反馈信号输入的伺服阀放大器&#xff0c;对射流管式电液伺服阀、喷嘴挡板式电液伺服阀及国外各类电液伺服阀进行控制。 通过系统参数有10V和4~20mA输入指令信号选择&#xff1b; 供电电源: 24VDC&#xff08;标准&#xff09; 输出电流&#xff1a;最大可达10…

Kuebernetes资源控制管理

第四阶段 时 间&#xff1a;2023年8月11日 参加人&#xff1a;全班人员 内 容&#xff1a; Kuebernetes资源控制管理 目录 Kubectl命令工具 一、kubectl 命令行的语法 二、kubectl命令列表 三、使用 Kubectl 工具容器资源 &#xff08;一&#xff09;创建Pod &…

并发——ThreadLocal关键字详解

文章目录 前言ThreadLocal代码演示ThreadLocal的数据结构GC 之后key是否为null&#xff1f;ThreadLocal.set()方法源码详解ThreadLocalMap Hash算法ThreadLocalMap Hash冲突ThreadLocalMap.set()详解ThreadLocalMap.set()原理图解ThreadLocalMap.set()源码详解 ThreadLocalMap过…

游戏选香港主机会很卡吗?

​  经常会有用户问道&#xff1a;做游戏服务器&#xff0c;使用香港主机会很卡吗?要知道&#xff0c;游戏运营最看重的就是用户体验&#xff0c;而游戏流畅不流畅要看所使用香港服务器本身的稳定性。因此&#xff0c;卡不卡&#xff0c;这样的形式提问是比较笼统的&#xf…

【EI检索】第九届建筑、土木与水利工程国际学术会议(ICACHE 2023)

第九届建筑、土木与水利工程国际学术会议&#xff08;ICACHE 2023&#xff09; 2023 9th International Conference on Architectural, Civil and Hydraulic Engineering 第九届建筑、土木与水利工程国际学术会议&#xff08;ICACHE 2023&#xff09;将于2023年10月13-15日在中…

现代无人机技术

目录 1.发展 2.应用领域 3.对战争的影响 4.给人类带来的福利 5.给人类带来的坏处 1.发展 无人机的发展可以分为以下几个关键步骤&#xff1a; 1. 早期试验和研究&#xff1a;20世纪初&#xff0c;飞行器的概念开始出现&#xff0c;并进行了一些早期的试飞和实验。这些尝试包…

第一部分:核心容器

前言&#xff1a;学习路线 Spring就是一个轻量级的控制反转&#xff08;IOC&#xff09;和面向切面编程&#xff08;AOP&#xff09;的框架&#xff01; 第一章&#xff1a;纯手写 一、核心概念 什么是IoC、IoC容器、bean、DI &#xff1f; IoC&#xff1a;对象创建控制权由程…

springboot项目为什么加载不出来页面

路径啥的都没问题。hh&#xff0c;非常简单&#xff0c;因为springboot项目默认访问静态static文件&#xff0c;把那种静态图片放在static文件下就解决了。

订单支付超时未支付关闭订单的解决方案

订单支付超时未支付关闭订单的解决方案 假设有客户下了订单但是迟迟未曾支付&#xff0c;会产生什么样的问题呢&#xff0c;大家联想一下京东淘宝拼多多&#xff0c;想一下大家购物的场景中&#xff0c;人家是怎么做的&#xff0c;然后再看看我们这么这篇文章&#xff01;&…

微信怎么恢复好友?这8个方法值得一试!

【微信之前忘记给别人备注名字&#xff0c;昨天清理好友时不小心误删了该怎么办啊&#xff01;好尴尬&#xff01;】 随着社交网络的快速发展&#xff0c;微信已成为我们生活中必不可少的交流工具。日积月累下来&#xff0c;微信里的联系人也就变得越来越多。但是&#xff0c;…

Map映射学习

一、Map的遍历 创建Map集合 Map<String, Integer> map new HashMap<>();添加元素 map.put("java", 99);map.put("c", 88);map.put("c", 93);map.put("python", 96);map.put("Go", 88); 遍历方法&#xff1a; …

自主学习库简化智能代理创建

观看当今毁灭人类的智能代理玩复杂的视频游戏可能很有趣 - 但创建一个是另一回事。构建有效的智能代理需要设置大量超参数来塑造环境、建立奖励等。来自马萨诸塞大学阿默斯特分校的一组研究人员试图通过他们新的自主学习图书馆项目来简化这一过程。 自治学习库是 PyTorch 的深…

Mysql - 配置Mysql主从复制-keepalived高可用-读写分离集群

目录 高可用&#xff1a; 为什么需要高可用呢&#xff1f; 高可用的主要作用&#xff1a; keepalived是什么&#xff1f;它用在哪里&#xff1f; 什么是VRRP协议&#xff0c;它的作用是什么&#xff1f; 搭建一个基于keepalived的高可用Mysql主从复制读写分离集群 一、项…

【vue3】解决scope.row.id套标签太多无法随着点击按钮而变化

实现要求:再点击每一行的修改按钮时&#xff0c;动态拿取该行的id传给后端作为pk(主键)实现数据库数据的修改&#xff0c;并显示在vue前端&#xff1b; 我遇到的问题&#xff1a;在2处使用 scope 作用域插槽拿取每一行的数据&#xff0c;在3处&#xff0c;删除按钮那一行代码&a…

BGP小综合

实验要求及拓扑 一、思路 1.使用OSPF使R2-R7之间可通。 2.各自宣告AS区域&#xff0c;两个区域两两之间建邻&#xff0c;AS2两个小区域之间建联邦&#xff08;R2与R5、R4与R7&#xff09;。 3.使R3、R6为路由反射器 RR反射器选取各小区域的路由器作为客户端 、非客户端 4.优…

分布式事务模式理论详解

&#x1f680; 分布式事务 &#x1f680; &#x1f332; AI工具、AI绘图、AI专栏 &#x1f340; &#x1f332; 如果你想学到最前沿、最火爆的技术&#xff0c;赶快加入吧✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域优质创作者&#x1f3c6;&…

SaaS,PaaS,IaaS之间的主要区别

SaaS&#xff0c;PaaS&#xff0c;IaaS之间的主要区别 不久之前&#xff0c;公司的所有IT系统都是本地部署&#xff0c;而云也只是天空中蓬松的白色物体。现在&#xff0c;几乎所有系统和进程都可以使用云平台。SaaS&#xff0c;PaaS和IaaS只是描述如何在企业中使用云的三种方…