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

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、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在线答疑。

在这里插入图片描述

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

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

相关文章

基于OpenCV的图形分析辨认03

目录 一、前言 二、实验目的 三、实验内容 四、实验过程 一、前言 编程语言&#xff1a;Python&#xff0c;编程软件&#xff1a;vscode或pycharm&#xff0c;必备的第三方库&#xff1a;OpenCV&#xff0c;numpy&#xff0c;matplotlib&#xff0c;os等等。 关于OpenCV&…

spring 注解缓存查询方法使用

spring-boot项目启动类上加注解: EnableCaching 查询方法注解: Cacheable

Sodinokibi勒索病毒最新变种,勒索巨额赎金

前言 Sodinokibi勒索病毒在国内首次被发现于2019年4月份&#xff0c;2019年5月24日首次在意大利被发现&#xff0c;在意大利被发现使用RDP攻击的方式进行传播感染&#xff0c;这款病毒被称为GandCrab勒索病毒的接班人&#xff0c;在短短几个月的时间内&#xff0c;已经在全球大…

缺陷检测:使用PatchCore训练自己的数据集

文章目录 前期准备两种方法 演示运行结果 代码详解见缺陷检测–PatchCore的代码解读 前期准备 必须包含有训练图片&#xff08;无缺陷图片&#xff09;、测试图片&#xff08;缺陷图片&#xff09;和ground_truth&#xff0c;并且ground_truth必须与对应图片的名称相同。 本文…

学习Java的第一天

一、Java简介 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称。由 James Gosling和同事们共同研发&#xff0c;并在 1995 年正式推出。 后来 Sun 公司被 Oracle &#xff08;甲骨文&#xff09;公司收购&#xff0c;Jav…

AI如何为人力资源服务?

组织的核心都是人力资源。从招聘到员工培养&#xff0c;再到评估员工绩效&#xff0c;人力资源&#xff08;HR&#xff09;在公司的持续发展中起着至关重要的作用。表面上看&#xff0c;这似乎是一个简单的任务。然而&#xff0c;实际上&#xff0c;这是世界上最复杂和最具挑战…

[数据结构初阶】栈

各位读者老爷好&#xff0c;鼠鼠我好久没写博客了&#xff08;太摆烂了&#xff09;&#xff0c;今天就基于C语言浅介绍一下数据结构里面的栈&#xff0c;希望对你有所帮助吧。 目录 1.栈的概念及结构 2.栈的实现 2.1定义栈 2.2.初始化栈 2.3.入栈 2.4.出栈 2.5.获取栈…

【Java EE初阶三十】JVM的简单学习

1. JVM 内存区域划分 一个运行起来的 Java 进程&#xff0c;就是一个 JVM 虚拟机&#xff0c;需要从操作系统申请一大块内存&#xff0c;就会把这个内存&#xff0c;划分成不同的区域&#xff0c;每个区域都有不同的作用. JVM 申请了一大块内存之后,也会划分成不同的内…

Git 基于ED25519、RSA算法生成 SSH 密钥

Git 基于ED25519、RSA算法生成 SSH 密钥 基于ED25519算法&#xff0c;生成密钥对命令如下&#xff1a; ssh-keygen -t ed25519 -C "邮箱地址"基于RSA算法&#xff0c;生成密钥对命令如下&#xff1a; ssh-keygen -t rsa -C "<注释内容>"基于ED255…

Day14:信息打点-主机架构蜜罐识别WAF识别端口扫描协议识别服务安全

目录 Web服务器&应用服务器差异性 WAF防火墙&安全防护&识别技术 蜜罐平台&安全防护&识别技术 思维导图 章节知识点 Web&#xff1a;语言/CMS/中间件/数据库/系统/WAF等 系统&#xff1a;操作系统/端口服务/网络环境/防火墙等 应用&#xff1a;APP对象/…

【多模态融合】CRN 多视角相机与Radar融合 实现3D检测、目标跟踪、BEV分割 ICCV2023

前言 本文介绍使用雷达与多视角相机融合&#xff0c;实现3D目标检测、3D目标跟踪、道路环境BEV分割&#xff0c;它是来自ICCV2023的。 会讲解论文整体思路、输入数据分析、模型框架、设计理念、损失函数等。 论文地址&#xff1a;CRN: Camera Radar Net for Accurate, Robus…

如何使用 CSS object-fit 进行图片的缩放和裁剪

简介 在处理图片时&#xff0c;你可能会遇到需要保持原始宽高比的情况。保持宽高比可以防止图片被拉伸或压缩而出现失真。解决这个问题的常见方法是使用 background-image CSS 属性。更现代的方法是使用 object-fit CSS 属性。 在本文中&#xff0c;你将探索 object-fit CSS …

如何在有/没有备份的情况下恢复华为上已删除的视频?6 个推荐选项

“我不小心删除了华为手机上的一堆视频。我怎样才能把它们找回来&#xff1f;我在谷歌上也找不到它们”。——来自知乎 在我们日常生活的喧嚣中&#xff0c;意外时有发生。无论是由于华为手机上的无意删除、恢复出厂设置、病毒感染、数据损坏还是系统故障&#xff0c;这些视频…

GEE数据——GEDI04_A_和GEDI02_A_002_MONTHLY出现的数据问题

简介 产品介绍 该数据集包含全球生态系统动力学调查&#xff08;GEDI&#xff09;第 4A 级&#xff08;L4A&#xff09;第 2 版对地上生物量密度&#xff08;AGBD&#xff0c;单位为兆克/公顷&#xff09;的预测&#xff0c;以及对每个采样地理定位激光足迹内预测标准误差的估…

python+django高校澡堂洗浴浴室预约签到管理系统8d8c

本系统在设计过程中&#xff0c;高校洗浴管理系统的出现就有很大的需求。该系统可以很好地解决这些麻烦和问题。 很好地发挥了该开发方式的优势&#xff0c;让实现代码有了良好的可读性&#xff0c;而且使代码的更新和维护更加的方便&#xff0c;操作简单&#xff0c;对以后的维…

前端将html导出pdf文件解决分页问题

这是借鉴了qq_251025116大佬的解决方案并优化升级完成的&#xff0c;原文链接 1.安装依赖 npm install jspdf html2canvas2.使用方法 import htmlToPdffrom ./index.jsconst suc () > {message.success(success);};//记得在需要打印的div上面添加 idlet dom document.que…

文心一言 VS 讯飞星火 VS chatgpt (209)-- 算法导论15.4 6题

六、设计一个 O(nlgn) 时间的算法&#xff0c;求一个 n 个数的序列的最长单调递增子序列。&#xff08;提示&#xff1a;注意到&#xff0c;一个长度为 i 的候选子序列的尾元素至少不比一个长度为 i-1 候选子序列的尾元素小。因此&#xff0c;可以在输入序列中将候选子序列链接…

如何在Linux上为PyCharm创建和配置Desktop Entry

在Linux操作系统中&#xff0c;.desktop 文件是一种桌面条目文件&#xff0c;用于在图形用户界面中添加程序快捷方式。本文将指导您如何为PyCharm IDE创建和配置一个 .desktop 文件&#xff0c;从而能够通过应用程序菜单或桌面图标快速启动PyCharm。 步骤 1: 确定PyCharm安装路…

Nodejs 第五十二章(定时任务)

什么是定时任务&#xff1f; 定时任务是指在预定的时间点或时间间隔内执行的任务或操作。它们是自动化执行特定逻辑的一种方式&#xff0c;可用于执行重复性的、周期性的或计划性的任务。 定时任务通常用于以下情况&#xff1a; 执行后台任务&#xff1a;定时任务可用于自动…

Nodejs 第五十一章(限流阀)

限流功能 目前我们学习了redis,lua,nodejs&#xff0c;于是可以结合起来做一个限流功能&#xff0c;好比一个抽奖功能&#xff0c;你点击次数过多&#xff0c;就会提示请稍后重试&#xff0c;进行限制&#xff0c;我们来实现一下该功能。 安装依赖 npm i ioredis express代码…