华为OD机试真题——宜居星球改造计划(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

news2025/6/2 7:07:03

在这里插入图片描述

2025 A卷 200分 题型

本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析;
并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式!

本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》

华为OD机试真题《宜居星球改造计划》:


目录

    • 题目名称:宜居星球改造计划
      • 题目描述
    • Java
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
      • 综合分析
    • python
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
      • 综合分析
    • JavaScript
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
      • 综合分析
    • C++
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
      • 综合分析
    • C语言
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
      • 综合分析
    • GO
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
      • 综合分析


题目名称:宜居星球改造计划


知识点:字符串、广度优先搜索(BFS)、逻辑处理
时间限制:1秒
空间限制:256MB
语言限制:不限


题目描述

2XXX年,人类通过火星大气改造分析,使其具备理论上的宜居条件。由于技术限制,改造需以局部网格进行。待改造区域为 row * column 网格,每个网格的值为:

  • YES:已完成大气改造的宜居区。
  • NO:未改造但可改造的区域。
  • NA:死亡区,不可改造且无法穿过。

规则说明

  1. 初始状态可能存在多个宜居区(YES),每个太阳日单位,宜居区会向上下左右四个方向扩散,将相邻的NO区域自动改造为YES。
  2. 要求计算所有NO区域是否能在有限时间内全部变为YES。若可以,返回改造所需的最短太阳日天数;否则返回 -1
  3. 注意:若初始网格中无YES或存在无法被扩散的NO区域(如被NA包围),则返回-1。

输入描述

  • 输入为 row * column 的网格数据,每行用空格分隔,例如:
    YES YES NO  
    NO NO NO  
    NA NO YES  
    

输出描述

  • 返回改造完成的最小太阳日天数,若无法完成则返回 -1

示例
输入1

YES YES NO  
NO NO NO  
YES NO NO  

输出1

2  

说明:经过2个太阳日,所有NO被改造为YES。

输入2

YES NO NO NO  
NO NO NO NO  
NO NO NO NO  
NO NO NO NO  

输出2

6  

输入3

NO NA  

输出3

-1  

说明:无初始YES,无法开始改造。

输入4

YES NO NO YES  
NO NO YES NO  
NO YES NA NA  
YES NO NA NO  

输出4

-1  

说明:右下角NO被NA包围,无法被扩散。


Java

问题分析

我们需要计算在给定网格中所有NO区域是否可以被初始的YES区域通过四向扩散完全覆盖,并求出所需的最小天数。若存在无法覆盖的NO区域或没有初始YES区域,则返回-1。


解题思路

  1. 输入处理与初始化:读取网格数据,统计初始YES位置和NO总数。
  2. 多源BFS:以所有初始YES为起点进行广度优先搜索,逐层扩散。
  3. 时间计算:每完成一层扩散(即一天),检查是否所有NO已被覆盖。
  4. 结果验证:若扩散结束后仍有未覆盖的NO,返回-1。

代码实现

import java.util.*;

public class Main {
   
    public static void main(String[] args) {
   
        Scanner scanner = new Scanner(System.in);
        List<String[]> gridLines = new ArrayList<>();

        // 读取输入构建网格
        while (scanner.hasNextLine()) {
   
            String line = scanner.nextLine().trim();
            if (line.isEmpty()) continue;
            gridLines.add(line.split("\\s+"));
        }

        if (gridLines.isEmpty()) {
   
            System.out.println(-1);
            return;
        }

        int rows = gridLines.size();
        int cols = gridLines.get(0).length;
        String[][] grid = new String[rows][cols];
        Queue<int[]> queue = new LinkedList<>();
        int remainingNO = 0;

        // 初始化队列和统计NO数量
        for (int i = 0; i < rows; i++) {
   
            for (int j = 0; j < cols; j++) {
   
                grid[i][j] = gridLines.get(i)[j];
                if (grid[i][j].equals("YES")) {
   
                    queue.add(new int[]{
   i, j});
                } else if (grid[i][j].equals("NO")) {
   
                    remainingNO++;
                }
            }
        }

        // 无初始YES或全为YES
        if (queue.isEmpty()) {
   
            System.out.println(-1);
            return;
        }
        if (remainingNO == 0) {
   
            System.out.println(0);
            return;
        }

        int[][] dirs = {
   {
   -1, 0}, {
   1, 0}, {
   0, -1}, {
   0, 1}};
        int days = 0;

        // BFS处理扩散
        while (!queue.isEmpty()) {
   
            int size = queue.size();
            boolean hasSpread = false;

            for (int i = 0; i < size; i++) {
   
                int[] pos = queue.poll();
                for (int[] dir : dirs) {
   
                    int x = pos[0] + dir[0];
                    int y = pos[1] + dir[1];

                    if (x >= 0 && x < rows && y >= 0 && y < cols && grid[x][y].equals("NO")) {
   
                        grid[x][y] = "YES";
                        queue.add(new int[]{
   x, y});
                        remainingNO--;
                        hasSpread = true;
                    }
                }
            }

            if (hasSpread) days++;
            if (remainingNO == 0) {
   
                System.out.println(days);
                return;
            }
        }

        System.out.println(-1);
    }
}

代码详细解析

  1. 输入处理:读取输入行并分割成网格数组。
  2. 网格初始化:遍历网格,记录初始YES位置到队列,并统计NO总数。
  3. 边界条件处理
    • 无初始YES直接返回-1。
    • 没有NO时返回0天。
  4. BFS扩散
    • 使用队列进行层次遍历,每次处理一层节点。
    • 对每个节点,检查四向邻居是否为NO,若是则标记为YES并加入队列。
    • 若该层有扩散行为(hasSpread),天数加一。
  5. 结果判断:若所有NO被覆盖,返回天数;否则返回-1。

示例测试

示例1输入:

YES YES NO  
NO NO NO  
YES NO NO  

输出

2

解析

  • 第1天扩散到周围NO,第2天完成剩余扩散。

示例2输入:

NO NA

输出

-1

解析

  • 无初始YES,无法开始扩散。

示例3输入:

YES NO NO YES  
NO NO YES NO  
NO YES NA NA  
YES NO NA NO  

输出

-1

解析

  • 右下角NO被NA包围,无法扩散。

综合分析

  1. 时间复杂度:O(N×M),每个网格节点被访问一次。
  2. 空间复杂度:O(N×M),用于存储网格和队列。
  3. 优势
    • 多源BFS高效:同时处理多个起点,确保最短路径。
    • 实时剪枝:一旦所有NO覆盖立即返回,减少无效计算。
  4. 适用场景:网格规模中等,且扩散路径无复杂障碍时表现最佳。

python

问题分析

我们需要计算在给定网格中所有NO区域是否可以被初始的YES区域通过四向扩散完全覆盖,并求出所需的最短天数。若存在无法覆盖的NO区域或没有初始YES区域,则返回-1。


解题思路

  1. 输入处理:读取网格数据,统计初始YES位置和NO总数。
  2. 多源BFS:以所有初始YES为起点进行广度优先搜索,按层扩散。
  3. 时间计算:每完成一层扩散(即一天),检查是否所有NO已被覆盖。
  4. 结果验证:若扩散结束后仍有未覆盖的NO,返回-1。

代码实现

import sys
from collections import deque

def main():
    # 读取输入构建网格
    grid = []
    for line in sys.stdin:
        line = line.strip()
        if not line:
            continue
        grid.append

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

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

相关文章

Linux下基本指令的介绍

目录 1.目标 2.快速认识指令 1.pwd 2.clear 3.ls 4.mkdir 5.cd 6.touch 3.细化每一条指令 1.ls指令 2.pwd指令 注&#xff1a; 3.cd指令 4.touch和mkdir指令 6.删除文件 4.总结 1.目标 上一篇博客中&#xff0c;我们了解了Linux的起源和发展&#xff0c;也知道…

零基础开始的网工之路第十四天------Linux程序管理

目录 一、Linux程序与进程 1、程序,进程,线程的概念 2、程序和进程的区别 3、进程和线程的区别 二、Linux进程基础(生命周期) 1、进程生命周期 2、父子进程的关系 三、程序管理 1、常见的软件包类型 四、Linux操作系统启动流程详解 1、概述 2、启动流程核心阶段 1…

SIGGRAPH 2025 | 快手可灵团队提出3D感知的电影级文本到视频生成框架CineMaster

Sora、可灵等视频生成模型令人惊艳的性能表现使得创作者仅依靠文本输入就能够创作出高质量的视频内容。然而&#xff0c;我们常见的电影片段通常是由导演在一个场景中精心布置多个目标的运动、摄像机拍摄角度后再剪辑而成的。例如&#xff0c;在拍摄赛车追逐的场景时&#xff0…

历年西安电子科技大学计算机保研上机真题

2025西安电子科技大学计算机保研上机真题 2024西安电子科技大学计算机保研上机真题 2023西安电子科技大学计算机保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/school 查找不同的连续数字串个数 题目描述 给定一个数字串&#xff0c;查找其中不同的连续数字串的个…

利用openwrt路由器和随身WIFI搭建CPE

背景&#xff1a; 最近5GCPE挺火&#xff0c;各种硬件层出不穷&#xff0c;包括DY上很多商家在推的AX3000叠加展锐RM500 5G模块&#xff0c;自己组装CPE&#xff0c;成本也在300 看了下开源硬件&#xff0c;其实就是一个开源的openwrt系统&#xff0c;硬件上5G模块通过usb协议…

科学智能赋能空间科学研究(2):AI4S 范式下空间科学实验的核心挑战

中国科学院空间应用工程与技术中心在空间科学实验领域的研究覆盖了多模态空间科学实验数据模式挖掘、领域知识抽取、跨学科知识融合与认知智能等研究内容&#xff0c;有效促进了空间科学实验领域的数据应用生态的体系化建设&#xff0c;相关研究成果已正式发表于权威学术期刊《…

Axure设计案例——科技感渐变线性图

想让数据变化趋势展示告别枯燥乏味&#xff0c;成为吸引观众目光的亮点吗&#xff1f;快来看看这个Axure设计的科技感渐变线性图案例&#xff01;科技感设计风格凭借炫酷的渐变色彩打破传统线性图的单调&#xff0c;营造出一种令人过目难忘的视觉体验。每一条线条都仿佛是流动的…

【Opencv+Yolo】Day2_图像处理

目录 一、图像梯度计算 图像梯度-sobal算子&#xff1a; Scharr&#xff1a;权重变化更大&#xff08;线条更加丰富&#xff0c;比Sobel更加细致捕捉更多梯度信息&#xff09; Laplacian算子&#xff1a;对噪音点敏感&#xff08;可以和其他一起结合使用&#xff09; 二、边…

STUSB4500 PPS(PD3.0)快充SINK模块——应用 解析

0 前言 朋友参加车展&#xff0c;收获一枚很漂亮的倍思65W氮化镓快充头&#xff0c;送给我了。 我看了手中只支持33W快充的三星陷入了沉思… 快充头支持PPS协议&#xff0c;我心思这玩意适合做可调电源啊&#xff01; 上网随便一查没查到&#xff0c;都是转换成5V、9V、12V等…

从认识AI开始-----解密门控循环单元(GRU):对LSTM的再优化

前言 在此之前&#xff0c;我已经详细介绍了RNN和LSTM&#xff0c;RNN虽然在处理序列数据中发挥了重要的作用&#xff0c;但它在实际使用中存在长期依赖问题&#xff0c;处理不了长序列&#xff0c;因为RNN对信息的保存只依赖一个隐藏状态&#xff0c;当序列过长&#xff0c;隐…

Docker系列(五):ROS容器化三叉戟 --- 从X11、Wayland到DockerFile实战全解析

引言 随着机器人操作系统&#xff08;ROS&#xff09;在机器人领域的广泛应用&#xff0c;容器化技术成为提高开发效率和简化部署的关键。在多种容器化方案中&#xff0c;基于X11、Wayland和标准Dockerfile的ROS容器化方式各有特点&#xff0c;它们在容器内安装ROS1和ROS2的实…

【位运算】常见位运算总结

位运算 常见位运算总结位1的个数比特位计数汉明距离只出现一次的数字只出现一次的数字 III 常见位运算总结 位1的个数 191. 位1的个数 给定一个正整数 n&#xff0c;编写一个函数&#xff0c;获取一个正整数的二进制形式并返回其二进制表达式中 设置位 的个数&#xff08;也被…

5G RedCap是什么-与标准5G的区别及支持路由器推荐

技术背景与重要性 从智能穿戴到工业传感器&#xff0c;物联网设备种类繁多&#xff0c;但并非所有设备都需要标准5G的全部功能。为满足这些中端应用的需求&#xff0c;3GPP在Release 17中引入了5G RedCap&#xff08;Reduced Capability&#xff09;&#xff0c;也称为5G NR-L…

纯html,js创建一个类似excel的表格

后台是php,表中数据可编辑,可删除,可提交到数据库 <!DOCTYPE html> <html> <head><meta charset="utf-8"><style>body {font-family: Arial, sans-serif;margin: 20px;background-color: #fff;}.toolbar {margin-bottom: 10px;disp…

如何使用windows下的vscode连接到本地虚拟机的linux

1.打开windows下的vscode 下载下图所示插件 下载完以后打开首选项选择设置搜索ssh 搜索ssh往下滑对下图打上勾 点击下图或者按ctrl shift P 搜索ssh 选择第一个&#xff0c;双击后 进入这个界面 好的window基本配置差不多 2.打开虚拟机 在终端中输入 sudo apt-get install…

Vue开发系列——零基础HTML引入 Vue.js 实现页面之间传参

目录 一、实现页面之间传参 二、使用 URL 查询参数实现传参(不需要额外引入vue-router) 一、实现页面之间传参 实现从a.html 向b.html传参param1value1, param2value2 二、使用 URL 查询参数实现传参(不需要额外引入vue-router) a.html页面 a.html代码&#xff1a; <!…

Ubuntu22.04 重装后,串口无响应

欢迎关注公号&#xff1a;每日早参&#xff0c;获取每日最新资讯&#xff01; 1&#xff1a;确认串口设备文件是否存在 在Ubuntu中&#xff0c;串口通常会映射为以下两种 /dev/ttyS*&#xff08;对于传统的串口&#xff09; /fragistics/dev/ttyUSB*&#xff08;对于USB转串口…

设计模式-发布订阅

文章目录 发布订阅概念发布订阅 vs 监听者例子代码 发布订阅概念 发布/订阅者模式最大的特点就是实现了松耦合&#xff0c;也就是说你可以让发布者发布消息、订阅者接受消息&#xff0c;而不是寻找一种方式把两个分离 的系统连接在一起。当然这种松耦合也是发布/订阅者模式最大…

C++之string的模拟实现

string 手写C字符串类类的基本结构与成员变量一、构造函数与析构函数二、赋值运算符重载三、迭代器支持四、内存管理与扩容机制五、字符串操作函数六、运算符重载总结 手写C字符串类 从零实现一个简易版std::string 类的基本结构与成员变量 namespace zzh { class string { …

Python打卡第38天

浙大疏锦行 作业&#xff1a; 了解下cifar数据集&#xff0c;尝试获取其中一张图片 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader , Dataset # DataLoader 是 PyTorch 中用于加载数据的工具 from torchvision im…