华为OD机试真题 Java 实现【疫情扩散时间计算】【2023 B卷 200分】,附详细解题思路

news2024/11/26 9:50:16

在这里插入图片描述

目录

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

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

专栏导读

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

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天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 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法

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

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

在这里插入图片描述

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

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

相关文章

【Python学习笔记】Matplotlib画图

Matplotlib画图 一、基本函数1. plt.plot2. plt.text3. 设置刻度4. 设置坐标5.设置网格 二、绘制折线图三、绘制散点图四、绘制柱状图五、绘制双坐标图 一、基本函数 1. plt.plot 参数功能选项color改变折线颜色‘r’,‘g’,‘b’,‘black’,‘gray’marker改变数据点的形状‘…

固态硬盘 vs 机械硬盘:选择合适的存储方案

随着计算机的快速发展&#xff0c;各种硬件组件如CPU、显卡以及制作工艺都取得了长足的进步&#xff0c;但是磁盘的发展相对较为缓慢&#xff0c;这也导致了磁盘性能在一定程度上限制了计算机的整体性能。为了解决这个问题&#xff0c;固态硬盘应运而生。 那么&#xff0c;我们…

(亲测)制作linux启动U盘

下载软碟通 https://cn.ultraiso.net/xiazai.html 点击文件中的打开&#xff0c;选中Linux系统 插入U盘&#xff0c;点击启动中的写入硬盘映像 点击之后会自动选中U盘。界面如下&#xff1a; 点击写入&#xff0c;点击后U盘会格式化&#xff0c;所以U盘里面有重要东西的话…

中国金融四十人论坛:2023年第二季度宏观政策报告(附下载)

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 • 运行环境&#xff1a;外部环境方面&#xff0c;全球经济景气回落&#xff0c;会酸交作仍在收秀。内部环演方百&#xff0c;公共支出进一步旅爱&#xff0c;真交利本显考上开&#xff0c;社酸塔这创…

neo4j终端操作

1】进入容器 (base) xiaokkkxiaokkkdeMacBook-Pro ~ % docker exec -it 77ed5fe2b52e /bin/bash 2】启动、停止neo4j root77ed5fe2b52e:/var/lib/neo4j/bin# ./neo4j start Neo4j is already running (pid:7). Run with --verbose for a more detailed error message.root7…

项目实战 — 消息队列(6){内存数据管理}

目录 一、设计数据结构 二 、实现管理方法 &#x1f345; 1、实现交换机管理 &#x1f345; 2、实现队列管理 &#x1f345; 3、实现绑定管理 &#x1f388;插入绑定操作 &#x1f388;删除绑定 &#x1f345; 4、进行消息管理 &#x1f345; 5、发送消息到指定队列 &a…

英文音频转文字app让音频秒变文字

小明是一名大学生&#xff0c;他在上大学的时候经常需要通过听老师讲课来获取知识。但是&#xff0c;他发现自己很难在听课的同时完整地记录下老师所讲的内容。于是&#xff0c;他开始寻找音频转文字手机软件有哪些。经过一段时间的探索&#xff0c;他找到了三款不错的软件&…

我开源的 c#+wpf 模仿网易云音乐播放器

MusicApp 介绍 gitee地址&#xff1a;https://gitee.com/liu_guo_feng/music-app 我开源的 c#wpf 模仿网易云音乐播放器 项目页面功能完成列表 首页(待完善) 每日推荐音乐 歌单详情 带播放列表 歌词页(待完善) 换肤功能(待完善) 系统托盘 … 预览 仅供学习使用 不作任何商业用…

查看单元测试用例覆盖率新姿势:IDEA 集成 JaCoCo

1、什么是 IDEA IDEA 全称 IntelliJ IDEA&#xff0c;是 Java 编程语言开发的集成环境。IntelliJ 在业界被公认为最好的 Java 开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE 支持、各类版本工具(git、SVN 等)、JUnit、CVS 整合、代码分析、 创新的 GUI…

Python入门自学进阶-Web框架——39、redis、rabbitmq、git——2

RabbitMQ的exchange&#xff0c;即交换机有不同的类型&#xff1a; 1.direct Exchange(直接交换机) 匹配路由键&#xff0c;只有完全匹配消息才会被转发 2.Fanout Excange&#xff08;扇出交换机&#xff09; 将消息发送至所有的队列 3.Topic Exchange(主题交换机) 将路由按模…

【机器学习 | 决策树】利用数据的潜力:用决策树解锁洞察力

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

山东气象 × 和鲸科技:第一届齐鲁风云气象智能算法挑战赛圆满收官

7 月 20 日&#xff0c;中国气象局印发《人工智能气象应用工作方案&#xff08;2023 - 2030年&#xff09;》&#xff0c;旨在加快布局国产人工智能气象应用技术体系建设&#xff0c;推动人工智能技术在气象观测、预报及服务中的深度融合应用&#xff0c;为监测精密、预报精准、…

网络安全 Day30-运维安全项目-堡垒机部署

运维安全项目-堡垒机部署 1. 运维安全项目-架构概述2. 运维安全项目之堡垒机2.1 堡垒机概述2.2 堡垒机选型2.3 环境准备2.4 部署Teleport堡垒机2.4.1 下载与部署2.4.2 启动2.4.3 浏览器访问teleport2.4.4 进行配置2.4.5 安装teleport客户端 2.5 teleport连接服务器 1. 运维安全…

【Windows】Windows开机密码重置

文章目录 前言一、问题描述二、操作步骤2.1 安装DaBaiCai_d14_v6.0_2207_Online.exe2.2 插入U盘2.3 打开大白菜&#xff0c;点击“一键制作USB启动盘”2.4 等待进度条走完2.5 重启电脑&#xff0c;开机按“F12”或者“F8”&#xff08;具体百度一下&#xff0c;对应品牌电脑开机…

DEVICENET转ETHERCAT网关连接西门子支持ethercat吗

你有没有遇到过生产管理系统中&#xff0c;设备之间的通讯问题&#xff1f;两个不同协议的设备进行通讯&#xff0c;是不是很麻烦&#xff1f;今天&#xff0c;我们为大家介绍一款神奇的产品&#xff0c;能够将不同协议的设备进行连接&#xff0c;让现场的数据交换不再困扰&…

Appium 移动端自动化测试 -- 常用元素操作

点击元素&#xff08;element&#xff09; element.click() 输入内容 element.send_keys(‘input_string’) 清空输入框内容 element.clear() 获取元素属性 element.get_property("text_length")element.get_attribute("class") 获取元素的text文本…

MySQL 慢查询探究分析

目录 背景&#xff1a; mysql 整体结构&#xff1a; SQL查询语句执行过程是怎样的&#xff1a; 知道了mysql的整体架构&#xff0c;那么一条查询语句是怎么被执行的呢&#xff1a; 什么是索引&#xff1a; 建立索引越多越好吗&#xff1a;   如何发现慢查询&#xff1…

Appium Android 自动化测试 -- 元素定位

自动化测试元素定位是难点之一&#xff0c;编写脚本时会经常卡在元素定位这里&#xff0c;有时一个元素能捣鼓一天&#xff0c;到最后还是定位不到。 Appium 定位方式和 selenium 一脉相承&#xff0c;selenium 中的定位方式Appium 中都支持&#xff0c;而 Appium 还增加了自己…

每天一道leetcode:剑指 Offer 32 - III. 从上到下打印二叉树 III(中等广度优先遍历)

今日份题目&#xff1a; 请实现一个函数按照之字形顺序打印二叉树&#xff0c;即第一行按照从左到右的顺序打印&#xff0c;第二层按照从右到左的顺序打印&#xff0c;第三行再按照从左到右的顺序打印&#xff0c;其他行以此类推。 示例 给定二叉树: [3,9,20,null,null,15,7…

pytorch Stream 多流处理

CUD Stream https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#c-language-extensions 中指出在kenel的调用函数中最后一个可选参数表示该核函数处在哪个流之中。 - 参数Dg用于定义整个grid的维度和尺寸&#xff0c;即一个grid有多少个block。为dim3类型。…