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

该博客介绍了华为OD机试中的一道题目,涉及一个N*N区域的地图,其中1表示感染区域,0表示未感染。题目要求计算全部区域被感染所需的天数。博客内容包括题目描述、输入输出说明、解题思路、Java算法源码以及实例展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目描述

在一个地图中(地图有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. 当队列不为空且还有未感染区域时,进行循环;
    • 取出队首元素;
    • 获取队首元素的坐标;
    • 记录感染天数;<
### 华为OD项目精准核酸检测的技术方案 #### 问题背景 为了实现新冠疫情的精准防控,避免全员核酸检测带来的资源浪费,华为OD项目的精准核酸检测旨在通过传染病流行病学调查和大数据析来确定潜在感染者群体。该过程不仅考虑确诊病例之间的直接接触关系,还涉及间接接触的可能性。 #### 解决方案概述 解决方案基于深度优先搜索(DFS)算法遍历所有可能存在传染风险的人群网络结构[^1]。具体来说: - 接收总人数`N`作为整个社区规模大小; - 获取确诊病例列表及其成员编号; - 构建并解析一个维度为`N×N`的布尔型二维数组形式的接触矩阵,其中元素值为`0`代表无接触记录而`1`则意味着存在密切接触情况; - **核心逻辑设计** 使用DFS递归方法探索每一个尚未访问过的节点(即个体),一旦遇到已知患者便停止进一步深入其子树支以防重复计算。对于非确诊对象但与其有过关联者标记为待检测状态,并继续追踪这些人的社交圈子直至穷尽全部可能性为止。 ```python def dfs(contact_matrix, visited_set, current_person): for other_person in range(len(contact_matrix)): if contact_matrix[current_person][other_person] and (other_person not in visited_set): visited_set.add(other_person) dfs(contact_matrix, visited_set, other_person) def count_need_test(n, confirmed_cases, contact_matrix): need_testing = set() # 将确诊病例加入到已经访问过集合中 for case in confirmed_cases: visited_set = {case} # 对于每个未被确认感染的人执行dfs查找他的密接人群 for person in range(n): if person not in visited_set: dfs(contact_matrix, visited_set, person) return len(visited_set.difference(confirmed_cases)) ``` - **优化措施** 鉴于实际应用场景下的大规模人口基数可能导致性能瓶颈,在此引入哈希表替代传统线性表用于存储已被探测完毕的目标集合并利用位运算加速判断两实体间是否存在交互行为的操作效率[^5]。 #### 测案例说明 针对上述函数提供了三个典型实例验证其正确性和鲁棒性: - 当仅有单个零星布的确诊病人时能够准确识别出仅限于此人的亲密伙伴需接受筛查; - 若多源并发传播链路交错复杂亦可全面覆盖至末端受影响单元而不遗漏任何可疑环节; - 特殊情形下如全封闭环境内全体居民均处于高危暴露状态下依旧保持稳定输出预期结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值