【华为OD-E卷 - 跳格子游戏 100分(python、java、c++、js、c)】

【华为OD-E卷 - 跳格子游戏 100分(python、java、c++、js、c)】

题目

地上共有N个格子,你需要跳完地上所有的格子,但是格子间是有强依赖关系的,跳完前一个格子后,后续的格子才会被开启,格子间的依赖关系由多组steps数组给出,steps[0]表示前一个格子,steps[1]表示steps[0]可以开启的格子:
比如[0,1]表示从跳完第0个格子以后第1个格子就开启了,比如[2,1],[2,3]表示跳完第2个格子后第1个格子和第3个格子就被开启了。
请你计算是否能由给出的steps数组跳完所有的格子,如果可以输出yes,否则输出no。
说明:
1.你可以从一个格子跳到任意一个开启的格子
2.没有前置依赖条件的格子默认就是开启的
3.如果总数是N,则所有的格子编号为[0,1,2,3…N-1]连续的数组

输入描述

  • 输入一个整数N表示总共有多少个格子,接着输入多组二维数组steps表示所有格子之间的依赖关系

输出描述

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

否则输出no。

备注

  • 1 ≤ N < 500 step[i].length = 2 0 ≤ step[i][0],step[i][1] < N

用例

用例一:
输入:
3
0 1
0 2
输出:
yes
用例二:
输入:
2
1 0
0 1
输出:
no
用例三:
输入:
6
0 1
0 2
0 3
0 4
0 5
输出:
yes
用例四:
输入:
5
4 3
0 4
2 1
3 2
输出:
yes

python解法

  • 解题思路:
  • 这段代码通过拓扑排序判断是否可以从图的起点遍历到所有节点。问题可以抽象为一个有向图中是否存在拓扑序列,使得所有节点都可以被访问。如果能够完成拓扑排序并且访问的节点数等于图中的节点数,则说明可以跳完所有格子。

以下是解题的主要步骤:

构建图与入度表:

使用 defaultdict 构建邻接表表示有向图。
使用一个列表 in_degree 来记录每个节点的入度(指向该节点的边数)。
初始化队列:

将入度为 0 的节点(没有依赖的节点)加入队列,因为这些节点可以作为起始点开始遍历。
拓扑排序:

使用队列按拓扑顺序遍历图。
每遍历一个节点,将其邻居节点的入度减 1,如果某个邻居节点的入度变为 0,则将其加入队列。
检查结果:

如果拓扑排序访问的节点数等于图中节点总数 N,则说明可以完成所有格子的跳跃。
如果访问的节点数小于 N,则说明存在环,无法完成跳跃

from collections import deque, defaultdict

def can_finish_all_grids(N, steps):
    """
    判断是否可以跳完所有格子。
    
    :param N: 总格子数(节点数)
    :param steps: 每个格子之间的跳跃关系(有向边列表)
    :return: "yes" 如果可以跳完所有格子,否则 "no"
    """
    # 构建图(邻接表)和入度数组
    graph = defaultdict(list)  # 存储邻接关系
    in_degree = [0] * N  # 记录每个节点的入度

    # 遍历跳跃关系,填充图和入度
    for step in steps:
        u, v = step  # u -> v 表示从 u 跳到 v
        graph[u].append(v)  # 添加邻接关系
        in_degree[v] += 1  # 更新 v 的入度

    # 初始化队列,将所有入度为 0 的节点加入队列
    queue = deque()
    for i in range(N):
        if in_degree[i] == 0:
            queue.append(i)

    visited_count = 0  # 记录访问过的节点数

    # 拓扑排序
    while queue:
        node = queue.popleft()  # 从队列中取出一个节点
        visited_count += 1  # 标记节点为已访问

        # 遍历当前节点的所有邻居
        for neighbor in graph[node]:
            in_degree[neighbor] -= 1  # 邻居节点的入度减 1
            if in_degree[neighbor] == 0:  # 如果邻居节点入度变为 0,则加入队列
                queue.append(neighbor)

    # 如果访问的节点数等于总节点数 N,则可以跳完所有格子
    return "yes" if visited_count == N else "no"

# 读取输入
import sys
input = sys.stdin.read
data = input().split()

# 解析输入数据
N = int(data[0])  # 第一个数字是格子总数
steps = []  # 后续每两个数字构成一对跳跃关系
for i in range(1, len(data), 2):
    steps.append([int(data[i]), int(data[i + 1])])

# 计算并输出结果
result = can_finish_all_grids(N, steps)
print(result)

java解法

  • 解题思路
  • 这段代码通过拓扑排序判断是否可以完成所有节点的访问,即是否能够从图中所有起点依次访问所有节点。问题可以抽象为有向无环图(DAG)是否存在完整的拓扑序列。如果可以完成拓扑排序并且访问的节点数等于图中总节点数 n,则说明图中不存在环,所有格子可以跳完。

以下是解题步骤和逻辑:

构建图和入度数组:

使用一个邻接表(List<List> graph)表示有向图的边。
使用数组 inDegree 记录每个节点的入度(被指向的次数)。
初始化队列:

将所有入度为 0 的节点(没有依赖的起始点)加入队列,作为拓扑排序的起点。
拓扑排序:

使用队列按拓扑顺序遍历图。
每遍历一个节点,将其邻居节点的入度减 1,如果某个邻居节点的入度变为 0,则将其加入队列。
检查结果:

如果拓扑排序访问的节点数等于图中总节点数 n,则说明图中不存在环,所有格子可以跳完。
如果访问的节点数小于 n,则说明存在环,无法完成跳跃

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        // 读取节点总数 n
        int n = Integer.parseInt(sc.nextLine());

        // 初始化入度数组和邻接表
        int[] inDegree = new int[n]; // 记录每个节点的入度
        List<List<Integer>> graph = new ArrayList<>(); // 邻接表表示有向图

        for (int i = 0; i < n; i++) {
            graph.add(new ArrayList<>()); // 初始化每个节点的邻接表
        }

        // 构建图
        while (sc.hasNextLine()) {
            String line = sc.nextLine(); // 读取输入行
            if (line.isEmpty()) break; // 如果是空行,停止读取
            String[] parts = line.split(" "); // 分割起点和终点
            int from = Integer.parseInt(parts[0]); // 起点
            int to = Integer.parseInt(parts[1]); // 终点
            graph.get(from).add(to); // 添加边 from -> to
            inDegree[to]++; // 更新终点节点的入度
        }

        // 初始化队列,加入所有入度为 0 的节点
        Queue<Integer> queue = new LinkedList<>();
        for (int i = 0; i < n; i++) {
            if (inDegree[i] == 0) { // 如果某节点的入度为 0,加入队列
                queue.add(i);
            }
        }

        // 拓扑排序
        int count = 0; // 记录访问过的节点数
        while (!queue.isEmpty()) {
            int current = queue.poll(); // 从队列中取出一个节点
            count++; // 标记当前节点为已访问
            for (int neighbor : graph.get(current)) { // 遍历当前节点的所有邻居
                inDegree[neighbor]--; // 邻居节点的入度减 1
                if (inDegree[neighbor] == 0) { // 如果邻居节点的入度变为 0,加入队列
                    queue.add(neighbor);
                }
            }
        }

        // 判断是否可以访问所有节点
        System.out.println(count == n ? "yes" : "no"); // 如果访问节点数等于 n,输出 "yes",否则输出 "no"
    }
}

C++解法

  • 解题思路
更新中

C解法

  • 解题思路

更新中

JS解法

  • 解题思路

更新中

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ROS2】☆ launch之Python

☆重点 ROS1和ROS2其中一个很大区别之一就是launch的编写方式。在ROS1中采用xml格式编写launch&#xff0c;而ROS2保留了XML 格式launch&#xff0c;还另外引入了Python和YAML 编写方式。选择哪种编写取决于每位开发人员的爱好&#xff0c;但是ROS2官方推荐使用Python方式编写…

Shell编程详解

文章目录 一、Linux系统结构二、Shell介绍1、Shell简介2、Shell种类3、Shell查询和切换 三、Shell基础语法1、注释2、本地变量3、环境变量3.1、查看环境变量3.2、临时设置环境变量3.3、永久设置环境变量 4、特殊变量5、控制语句5.1、shell中的中括号5.2、if语句5.3、for循环5.4…

Zemax 序列模式下的扩束器

扩束器结构原理 扩束器用于增加准直光束&#xff08;例如激光束&#xff09;的直径&#xff0c;同时保持其准直。它通常用于激光光学和其他需要修改光束大小或发散度的应用。 在典型的扩束器中&#xff0c;输入光束是准直激光器&#xff0c;或光束进入第一个光学元件。当光束开…

react-quill 富文本组件编写和应用

index.tsx文件 import React, { useRef, useState } from react; import { Modal, Button } from antd; import RichEditor from ./RichEditor;const AnchorTouchHistory: React.FC () > {const editorRef useRef<any>(null);const [isModalVisible, setIsModalVis…

【深度学习】多目标融合算法(二):底部共享多任务模型(Shared-Bottom Multi-task Model)

目录 一、引言 1.1 往期回顾 1.2 本期概要 二、Shared-Bottom Multi-task Model&#xff08;SBMM&#xff09; 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 三、总结 一、引言 在朴素的深度学习ctr预估模型中&#xff08;如DNN&#xff09;&#xff0c;通常以一个行…

探秘MetaGPT:革新软件开发的多智能体框架(22/30)

一、MetaGPT 引发的 AI 变革浪潮 近年来&#xff0c;人工智能大模型领域取得了令人瞩目的进展&#xff0c;GPT-3、GPT-4、PaLM 等模型展现出了惊人的自然语言处理能力&#xff0c;仿佛为 AI 世界打开了一扇通往无限可能的大门。它们能够生成流畅的文本、回答复杂的问题、进行创…

LabVIEW软件Bug的定义与修改

在LabVIEW软件开发过程中&#xff0c;bug&#xff08;程序错误或缺陷&#xff09;指的是程序中导致不符合预期行为的任何问题。Bug可能是由于编码错误、逻辑漏洞、硬件兼容性问题、系统资源限制等因素引起的。它可能会导致程序崩溃、功能无法正常执行或输出结果不符合预期。理解…

高性能网络模式:Reactor 和 Proactor

Reactor Reactor 采用I/O多路复用监听事件&#xff0c;收到事件后&#xff0c;根据事件类型分配给某个进程/线程。 实际应用中用到的模型&#xff1a; 单 Reactor 单进程 单 Reactor 多线程 优点&#xff1a;能充分利用多核CPU性能。 缺点&#xff1a;存在多线程竞争共享资源…

扩散模型论文概述(三):Stability AI系列工作【学习笔记】

视频链接&#xff1a;扩散模型论文概述&#xff08;三&#xff09;&#xff1a;Stability AI系列工作_哔哩哔哩_bilibili 本期视频讲的是Stability AI在图像生成的工作。 同样&#xff0c;第一张图片是神作&#xff0c;总结的太好了&#xff01; 介绍Stable Diffusion之前&…

大数据技术-Hadoop(四)Yarn的介绍与使用

目录 一、Yarn 基本结构 1、Yarn基本结构 2、Yarn的工作机制 二、Yarn常用的命令 三、调度器 1、Capacity Scheduler&#xff08;容量调度器&#xff09; 1.1、特点 1.2、配置 1.2.1、yarn-site.xml 1.2.2、capacity-scheduler.xml 1.3、重启yarn、刷新队列 测试 向hi…

玩转大语言模型——ollama导入huggingface下载的模型

ollama导入huggingface模型 前言gguf模型查找相关模型下载模型 导入Ollama配置参数文件导入模型查看导入情况 safetensfors模型下载模型下载llama.cpp配置环境并转换 前言 ollama在大语言模型的应用中十分的方便&#xff0c;但是也存在一定的问题&#xff0c;比如不能使用自己…

apollo内置eureka dashboard授权登录

要确保访问Eureka Server时要求输入账户和密码&#xff0c;需要确保以下几点&#xff1a; 确保 eurekaSecurityEnabled 配置为 true&#xff1a;这个配置项控制是否启用Eureka的安全认证。如果它被设置为 false&#xff0c;即使配置了用户名和密码&#xff0c;也不会启用安全认…

【Dify】Dify自定义模型设置 | 对接DMXAPI使用打折 Openai GPT 或 Claude3.5系列模型方法详解

一、Dify & DMXAPI 1、Dify DIFY&#xff08;Do It For You&#xff09;是一种自动化工具或服务&#xff0c;旨在帮助用户简化操作&#xff0c;减少繁琐的手动操作&#xff0c;提升工作效率。通过DIFY&#xff0c;用户能够快速完成任务、获取所需数据&#xff0c;并且可以…

【深度学习】布匹寻边:抓边误差小于3px【附完整链接】

布匹寻边 项目简介 布匹寻边是指布料裁剪过程中&#xff0c;通过AI寻边技术自动识别布匹的边缘&#xff0c;将检测到的边缘信息输出&#xff0c;确保裁剪的准确性&#xff0c;减少浪费&#xff0c;并提高生产效率。 项目需求 将打满针眼的布匹边缘裁剪掉&#xff0c;且误差小…

http range 下载大文件分片

摘自&#xff1a;https://www.jianshu.com/p/32c16103715a 上传分片下载也能分 HTTP 协议范围请求允许服务器只发送 HTTP 消息的一部分到客户端。范围请求在传送大的媒体文件&#xff0c;或者与文件下载的断点续传功能搭配使用时非常有用。 检测服务器端是否支持范围请求 假…

解决WordPress出现Fatal error: Uncaught TypeError: ftp_nlist()致命问题

错误背景 WordPress版本&#xff1a;wordpress-6.6.2-zh_CN WooCommerce版本&#xff1a;woocommerce.9.5.1 WordPress在安装了WooCommerce插件后&#xff0c;安装的过程中没有问题&#xff0c;在安装完成后提示&#xff1a; 此站点遇到了致命错误&#xff0c;请查看您站点管理…

用户使用LLM模型都在干什么?

Anthropic 对用户与 Claude 3.5 Sonnet 的大量匿名对话展开分析&#xff0c;主要发现及相关情况如下&#xff1a; 使用用途分布 软件开发主导&#xff1a;在各类使用场景中&#xff0c;软件开发占比最高&#xff0c;其中编码占 Claude 对话的 15% - 25%&#xff0c;网页和移动应…

【巨实用】Git客户端基本操作

本文主要分享Git的一些基本常规操作&#xff0c;手把手教你如何配置~ ● 一个文件夹中初始化Git git init ● 为了方便以后提交代码需要对git进行配置&#xff08;第一次使用或者需求变更的时候&#xff09;&#xff0c;告诉git未来是谁在提交代码 git config --global user.na…

腾讯云AI代码助手编程挑战赛:自动生成漂亮的网页

在当今数字化时代&#xff0c;网页设计和开发已经成为一项至关重要的技能。在当今时代&#xff0c;借助AI的力量&#xff0c;这部分工作变得简单。本文借助腾讯云AI代码助手——“自动生成需要的网页”。本文将详细介绍如何利用AI代码助手生成网页素材&#xff0c;帮助你轻松打…

多台PC共用同一套鼠标键盘

当环境中有多个桌面 pc 需要操作的时候&#xff0c;在 多台 pc 之间切换会造成很多的不方便 可以通过远程进行连接&#xff0c;但是有一个更好的方案是让多台机器之间共用同一套键盘鼠标 常用的解决方案 synergy 和 sharemouse&#xff0c;通过移动光标在不同的 pc 间切换 s…