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

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、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];// 二维数组的大小Mint 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) {// 无法跳完所有格子,标志置为falsestepAllGrids[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.rhkb.cn/news/85412.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【前端】jeecgboot vue3开发过程使用方法整理

【前端】jeecgboot vue3开发过程使用方法整理 //定义变量 let list ref([]) 获取当前用户信息 const { userInfo } useUserStore(); 组件 componentProps属性 可以参考AntDesignVue3的文档 选择器 Select - Ant Design Vue (antdv.com) JDictSelectTag {label: "用户…

Linux系统USB转串口芯片 GPIO使用教程

一、简介 WCH的多款USB转单路/多路异步串口芯片&#xff0c;除串口接口以外&#xff0c;还提供独立的GPIO接口&#xff0c;各GPIO引脚支持独立的输出输入&#xff0c;GPIO功能的使用需要与计算机端厂商驱动程序和应用软件配合使用。各芯片的默认GPIO引脚状态有所区别&#xff…

【数据结构】“单链表”的练习题(二)

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Signal Desktop for Mac(专业加密通讯软件)中文版安装教程

想让您的聊天信息更安全和隐藏吗&#xff1f; Mac版本的Signal Desktop是MACOS上的专业加密通信工具&#xff0c;非常安全。使用信号协议&#xff0c;该协议结合了固定前密钥&#xff0c;双重RATCHES算法和3-DH握手信号&#xff0c;该信号可以确保第三方实体将不会传达您的消息…

JAVA SpringBoot 项目 多线程、线程池的使用。

1.1 线程&#xff1a; 线程就是进程中的单个顺序控制流&#xff0c;也可以理解成是一条执行路径 单线程&#xff1a;一个进程中包含一个顺序控制流&#xff08;一条执行路径&#xff09; 多线程&#xff1a;一个进程中包含多个顺序控制流&#xff08;多条执行路径&#xff0…

【ROS】fsd_algorithm架构学习与源码分析(致敬)

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍fsd_algorithm架构学习与源码分析。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&am…

日常BUG——使用Long类型作id,后端返回给前段后精度丢失问题

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 数据库long类型Id: 前端返回的Id实体类: Data ApiModel("xxx") public class …

# X11、Xlib、XFree86、Xorg、GTK、Qt、Gnome和KDE之间的关系

X11、Xlib、XFree86、Xorg、GTK、Qt、Gnome和KDE之间的关系 很多人对于他们是啥是傻傻分不清的&#xff0c;我做了个表格供大家参考。 摘抄&#xff1a; X11是X Window System Protocol, Version 11&#xff08;RFC1013&#xff09;&#xff0c;是X server和X client之间的通…

CMU 15-445 -- Distributed OLTP Databases -20

CMU 15-445 -- Distributed OLTP Databases -20 引言AssumptionAgendaAtomic Commit ProtocolsTwo-Phase Commit (2PC)2PC Success2PC Abort2PC OptimizationsFault Tolerant PaxosMulti-Paxos 2PC vs. Paxos ReplicationReplication ConfigurationApproach #1: Master-Replica…

Java基础入门篇——Java变量类型的转换和运算符(七)

目录 一、变量类型 1.1自动类型转换&#xff08;隐式转换&#xff09; 1.2 强制类型转换&#xff08;显式转换&#xff09; 1.3类型转换的其他情况 二、运算符 2.1算术运算符 2.2比较运算符 2.3逻辑运算符 2.4位运算符 三、总结 在Java中&#xff0c;变量类型的转换…

Java ThreadLocal是什么

文章目录 引子&#xff1a;SimpleDateFormat类ThreadLocal是什么ThreadLocal 的另一个用途**总结**ThreadLocal的两大用途ThreadLocal 的源代码ThreadLocalMapThreadLocalMap 的问题ThreadLocal的key为什么设置成弱引用&#xff1f;value为什么不是弱引用&#xff1f;Thread、T…

如何让你的视频在 TikTok上变得火爆?

TikTok凭借巨大的用户量和商业价值&#xff0c;它从来不缺优质内容。如何在众多内容中脱颖而出获得关注&#xff0c;这并不简单。和泛流量账号不同&#xff0c;商业账号的目的更加明确&#xff0c;也就是说&#xff0c;商业账号并不一定要以高流量最为唯一的追求目标&#xff0…

跨域+四种解决方法

文章目录 一、跨域二、JSONP实现跨域请求三、前端代理实现跨域请求四、后端设置请求头实现跨域请求五、Nginx代理实现跨域请求5.1 安装Nginx软件5.2 使用Ubuntu安装nginx 本文是在学习课程满神yyds后记录的笔记&#xff0c;强烈推荐读者去看此课程。 一、跨域 出于浏览器的同…

JVM笔记 —— 出现内存溢出错误时时如何排查

一、出现内存溢出的几种情况 内存溢出错误分为StackOverflowError和OutOfMemoryError&#xff0c;前者是栈中出现溢出&#xff0c;后者一般是堆或方法区出现溢出&#xff0c;简称OOM 1. 栈溢出 StackOverflowError 栈溢出一般都是因为没有正确的结束递归导致的&#xff0c;无…

Qt5兼容使用之前Qt4接口 intersect接口

1. 问题 项目卡中遇到编译报错&#xff0c; 错误 C2039 “intersect”: 不是“QRect”的成员 。 2. 排查过程 排查到依赖的第三方代码&#xff0c;使用 intersect 接口&#xff0c; 跟踪排查到头文件中使用了***#if QT_DEPRECATED_SINCE(5, 0)*** #if QT_DEPRECATED_SINCE…

【CSS】CSS 选择器

CSS 选择器 1.基础选择器 1.1 元素选择器 语法&#xff1a;标签名{...} 元素选择器会选中对应标签名的HTML元素&#xff0c;例如&#xff1a;p{...}&#xff0c;div{...}&#xff0c;span{...}等 1.2 类选择器 语法&#xff1a;.类名{...} 类选择器会选中class属性为指定…

[Idea热部署]两秒钟学会热部署

两者同时适配好,保证没有问题 哈&#xff0c;谢谢各位同志的阅读&#xff0c;然后呢如果觉得本文对您有所帮助的话&#xff0c;还给个免费的赞捏 Thanks♪(&#xff65;ω&#xff65;)&#xff89;

【ArcGIS Pro二次开发】(58):数据的本地化存储

在做村规工具的过程中&#xff0c;需要设置一些参数&#xff0c;比如说导图的DPI&#xff0c;需要导出的图名等等。 每次导图前都需要设置参数&#xff0c;虽然有默认值&#xff0c;但还是需要不时的修改。 在使用的过程中&#xff0c;可能会有一些常用的参数&#xff0c;希望…

每天一道leetcode:139. 单词拆分(动态规划中等)

今日份题目&#xff1a; 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例1 输入: s "leetcode", …

【解密算法:时间与空间的博弈】

本章重点 ​​什么是数据结构&#xff1f; 什么是算法&#xff1f; 算法效率 时间复杂度 空间复杂度 常见时间复杂度以及复杂度oj练习 1. 什么是数据结构&#xff1f; 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系…