华为OD机试 - 疫情扩散时间计算 - 矩阵(Java 2024 C卷 200分)

news2025/1/21 0:54:00

在这里插入图片描述

目录

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

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

专栏导读

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

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

一、题目描述

在一个地图中(地图有N*N个区域组成),有部分区域被感染病菌。

感染区每天都会把周围(上下左右)的4个区域感染。

请根据给定的地图计算,多少天后,全部区域都会被感染。 如果初始地图上所有区域全部都被感染,或者没有被感染,返回-1

二、输入描述

一行N*N个数字(只包含0,1,不会有其他数字)表示一个地图,数字间用“,”分割,0表示未感染区域,1表示已经感染区域
每N个数字表示地图中一行,输入数据共表示N行N列的区域地图。 例如输入1,0,1,0,0,0,1,0,1,表示地图

1, 0, 1
0, 0, 0
1, 0, 1

三、输出描述

一个整数,表示经过多少天后,全部区域都被感染1 <=N <= 200

四、解题思路

  1. 将输入字符串转换为一维数组;
  2. 将一维数组转换为二维矩阵;
  3. 定义感染区域队列arrQueue;
    • 将一维数组转换为二维矩阵;
    • 将感染区域加入队列;
  4. 判断特殊情况;
  5. 记录未感染区域数量;
  6. 记录四个方向的偏移量;
  7. 记录感染天数;
  8. 当队列不为空且还有未感染区域时,进行循环;
    • 取出队首元素;
    • 获取队首元素的坐标;
    • 记录感染天数;
    • 遍历四个方向;
      • 定义新的横坐标;
      • 定义新的纵坐标;
      • 判断边界;
      • 如果该区域未感染;
        • 未感染区域数量减一;
        • 标记该区域已感染;
        • 将该区域加入队列;
    • 返回感染天数;
  9. 返回感染天数;

五、Java算法源码

package com.guor.od;

import java.util.*;

public class OdTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        List<Integer> map = new ArrayList<>();
        int pos = 0;
        String token = "";
        // 将输入字符串转换为一维数组
        while ((pos = input.indexOf(",")) != -1) {
            token = input.substring(0, pos);
            map.add(Integer.parseInt(token));
            input = input.substring(pos + 1);
        }
        map.add(Integer.parseInt(input));
        // 输出感染天数
        System.out.println(getResult(map));
    }

    public static int getResult(List<Integer> map) {
        int n = (int) Math.sqrt(map.size());
        // 将一维数组转换为二维矩阵
        int[][] matrix = new int[n][n];
        // 用队列存储感染区域
        Queue<int[]> arrQueue = new LinkedList<>();

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                // 将一维数组转换为二维矩阵
                matrix[i][j] = map.get(i * n + j);
                // 将感染区域加入队列
                if (matrix[i][j] == 1) {
                    arrQueue.offer(new int[]{i, j});
                }
            }
        }

        // 判断特殊情况
        if (arrQueue.isEmpty() || arrQueue.size() == map.size()) {
            return -1;
        }

        // 记录未感染区域数量
        int healthyNum = map.size() - arrQueue.size();

        // 记录四个方向的偏移量
        int[][] offSets = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

        // 记录感染天数
        int day = 0;
        // 当队列不为空且还有未感染区域时,进行循环
        while (!arrQueue.isEmpty() && healthyNum > 0) {
            // 取出队首元素
            int[] arr = arrQueue.poll();
            // 获取队首元素的坐标
            int x = arr[0];
            int y = arr[1];
            // 记录感染天数
            day = matrix[x][y] + 1;

            // 遍历四个方向
            for (int[] offset : offSets) {
                // 新的横坐标
                int x_new = x + offset[0];
                // 新的纵坐标
                int y_new = y + offset[1];
                // 判断边界
                if (x_new < 0 || x_new >= n || y_new < 0 || y_new >= n) {
                    continue;
                }

                // 如果该区域未感染
                if (matrix[x_new][y_new] == 0) {
                    // 未感染区域数量减一
                    healthyNum--;
                    // 标记该区域已感染
                    matrix[x_new][y_new] = day;
                    // 将该区域加入队列
                    arrQueue.offer(new int[]{x_new, y_new});
                }
            }
        }

        return day - 1; // 返回感染天数
    }
}

六、效果展示

1、输入

1,0,1,0,0,0,1,0,1

2、输出

2

3、说明

一天以后,地图中仅剩余中心点未被感染,2天后,全部被感染。

在这里插入图片描述


🏆下一篇:华为OD机试 - 最长的顺子 - 感谢@禁止你发言提供的更简便算法(Java 2023 B卷 200分)

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

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

在这里插入图片描述

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

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

相关文章

图论 - DFS深度优先遍历、BFS广度优先遍历、拓扑排序

文章目录 前言Part 1&#xff1a;DFS&#xff08;深度优先遍历&#xff09;一、排列数字1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 二、n皇后问题1.问题描述输入格式输出格式数据范围输入样例输出样例 2.算法 三、树的重心1.问题描述输入格式输出格式数据范围…

Ubuntu 下使用 Pybind11 实现 C++ 调用 Python 接口的示例

Pybind11 是一个轻量级的库&#xff0c;它提供了在 C 中无缝集成 Python 代码的能力。使用 Pybind11&#xff0c;你可以很容易地从 C 调用 Python 代码&#xff0c;反之亦然。下面我将通过一个简单的例子来展示如何在 Ubuntu 系统上使用 Pybind11 从 C 调用 Python 接口。 安装…

嵌入式常见概念介绍

什么是ARM&#xff1a; Advanced RISC Machines 先进RISC机器 嵌入式系统自诞生起就分为两条路&#xff1a; RISC&#xff1a;精简指令集计算机&#xff0c;如ARM&#xff0c;所有指令长度一致&#xff0c;指令数量较少 CISC&#xff1a;复杂指令集计算机&#xff0…

git 如何将多个提交点合并为一个提交点 commit

文章目录 核心命令详细使用模式总结示例 核心命令 git merge branch2 是将分支branch2的提交点合并到本地当前分支。 而在执行这条命令的时候&#xff0c;加一个选项--squash就表示在合并的时候将多个提交点合并为一个提交点。 git merge --squash branch2 先看squash单词的意…

2023年CSP-J认证 CCF信息学奥赛C++ 中小学初级组 第一轮真题-选择题解析

2023年 中小学信息学奥赛CSP-J真题解析 1、在C中&#xff0c;下面哪个关键字用于声明一个变量&#xff0c;其值不能被修改 A、unsigned B、const C、static D、mutable 答案&#xff1a;B 考点分析&#xff1a;主要考查变量声明相关知识&#xff0c;const是声明常量&…

LeetCode 刷题 [C++] 第98题.验证二叉搜索树

题目描述 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 题目分析 由题…

指针数组初始化,不常见啊

今天无意间看到这样一段代码&#xff0c;因为还是第一次看到&#xff0c;这是glibc库里的代码&#xff0c;写出来分享一下&#xff1a; #ifndef ERR_MAP # define ERR_MAP(n) n #endif const char *const _sys_errlist_internal[] { #define _S(n, str) [ERR_MAP(n)] …

职场中的团队合作与个人成长

在职场中&#xff0c;团队合作和个人成长是两个不可或缺的要素。一个优秀的团队可以带来更高的工作效率和更好的业绩&#xff0c;而个人的成长则是职场成功的关键。本文将探讨如何在职场中实现团队合作与个人成长的平衡。 一、团队合作的重要性 在职场中&#xff0c;团队合作是…

授权认证登录之 Cookie、Session、Token、JWT 详解

授权认证登录之 Cookie、Session、Token、JWT 详解 一、先了解几个基础概念什么是认证&#xff08;Authentication&#xff09;什么是授权&#xff08;Authorization&#xff09;什么是凭证&#xff08;Credentials&#xff09; 二、Cookie1、了解 Cookie2、cooker的创建2、coo…

【数据结构】队列 循环队列 双端队列——顺序队列+链式队列完整代码(创建、入队、出队)

2.队列 2.1 队列的定义 定义 只允许在一端进行插入&#xff0c;另一端删除的线性表。 特征&#xff1a;先进先出&#xff08;First In First Out->FIFO&#xff09; 重要术语&#xff1a;队头、队尾、空队列 2.2 队列的顺序存储 2.2.1 初始化 结构体 typedef struct{…

数字人民币钱包(二)

文章目录 前言一 什么是数字人民币钱包&#xff1f;二 怎么开通数字人民币钱包&#xff1f;三 数字人民币钱包有哪些&#xff1f;四 数字人民币钱包升级 前言 上篇文章梳理了什么是数字人民币&#xff0c;及其特征和相关概念&#xff0c;这篇文章来整理下数字人民币钱包。数字人…

TOMCAT多实例及调优

一、JVM相关理论 &#xff08;一&#xff09;JVM组成 1.JVM组成部分 类加载子系统: 使用Java语言编写.java Source Code文件&#xff0c;通过javac编译成.class Byte Code文件。class loader类加载器将所需所有类加载到内存&#xff0c;必要时将类实例化成实例 运行时数据区…

1908_Arm Cortex-M3的实现

1908_Arm Cortex-M3的实现 全部学习汇总&#xff1a; g_arm_cores: ARM内核的学习笔记 (gitee.com) 这是第一次看一份这样的手册&#xff0c;之前的MCU编程基本上就是专注于软件接口方面。而OS等方面的一些功能基本上都是用了现成的解决方案&#xff0c;因此也就没有过多的关注…

NXP iMX8MM Cortex-M4 核心 GPT Capture 测试

By Toradex秦海 1). 简介 NXP i.MX8 系列处理器均为异构多核架构 SoC&#xff0c;除了可以运行 Linux 等复杂操作系统的 Cortax-A 核心&#xff0c;还包含了可以运行实时操作系统比如 FreeRTOS 的 Cortex-M 核心&#xff0c;本文就演示通过 NXP i.MX8MM 处理器集成的 Cortex-…

基于Springboot+Layui餐厅点餐系统

一、项目背景 在互联网经济飞速发展的时代&#xff0c;网络化企业管理也在其带领下快速兴起&#xff0c;开发一款自主点餐系统会受到众多商家的青睐。现如今市场上的人力资源价格是非常高昂的&#xff0c;一款自主点餐系统可以减少餐厅的人力开销&#xff0c;将服务员从繁忙的…

建立自己的富足金字塔

本文的理论参考&#xff1a; 1、《金字塔原理》&#xff0c;可以简述为&#xff1a;上下层互为支撑的结构化表达&#xff0c;通常为1-3-9结构&#xff1b;完全穷举、互不交叉&#xff0c;或不重不漏MECE的分门分类&#xff1b;真实有效&#xff0c;真知灼见。 2、《金线》在金字…

贷齐乐错误的waf引起的SQL注入漏洞复现

君衍. 一、环境介绍1、第一道WAF2、第二道WAF 二、环境部署1、模拟源码2、连接数据库源码3、数据库创建4、测试 三、源码分析1、模拟WAF2、注入思路3、PHP下划线特性4、完成假设 四、联合查询注入1、测试回显字段2、爆出库名3、爆出表名4、爆出表下的列名4、爆出flag 一、环境介…

AI大模型与小模型之间的“脱胎”与“反哺”(第五篇)

一、背景 AI大模型与小模型之间存在一种“脱胎”与“反哺”的关系&#xff0c;这种关系在AI技术的发展中起到了重要的作用。 首先&#xff0c;我们来理解一下“脱胎”的概念。在AI领域&#xff0c;大模型通常具有更大的参数量、更强的表达能力和更高的计算需求。这些大模型通…

第一个 Angular 项目 - 添加路由

第一个 Angular 项目 - 添加路由 前置项目是 第一个 Angular 项目 - 添加服务&#xff0c;之前的切换页面使用的是 ngIf 对渲染的组件进行判断&#xff0c;从而完成渲染。这一步的打算是添加路由&#xff0c;同时添加 edit recipe 的功能(同样通过路由实现) 用到的内容为&…

RabbitMQ 交换器

RabbitMQ 交换器 官方例子 http://www.rabbitmq.com/getstarted.html direct 如上图所示&#xff0c;两个队列绑定到了direct交换器上&#xff0c;第一个队列绑定的 binding key 为 orange &#xff0c;第二个队列有两个绑定&#xff0c;分别是 black 和 green 。 如上图所示…