华为OD机试D卷C卷 - 核酸检测(C++ Java JavaScript Python C语言)

本文详细解析华为OD机试中的核酸筛查问题,介绍如何通过深度优先搜索(DFS)解决这个问题,包括输入输出描述、解题思路以及C++、Java、JavaScript、Python和C语言的代码实现。
摘要由CSDN通过智能技术生成

题目描述

为了达到新冠疫情精准防控的需要,为了避免全员核酸检测带来的浪费,需要精准圈定可能被感染的人群。

现在根据传染病流调以及大数据分析,得到了每个人之间在时间、空间上是否存在轨迹的交叉。

现在给定一组确诊人员编号 (X1,X2,X3,…Xn)在所有人当中,找出哪些人需要进行核酸检测,输出需要进行核酸检测的数。

(注意:确诊病例自身不需要再做核酸检测)需要进行核酸检测的人,是病毒传播链条上的所有人员,即有可能通过确诊病例所能传播到的所有人。

例如:A是确诊病例,A和B有接触、B和C有接触 C和D有接触,D和E有接触。那么B、C、D、E都是需要进行核酸检测的人

输入描述

第一行为总人数N

第二行为确证病例人员编号(确证病例人员数量<N),用逗号隔开

接下来N行,每一行有N个数字,用逗号隔开,其中第i行的第j个数字表名编号i是否与编号j接触过。0表示没有接触,1表示有接触

备注:

人员编号从0开始

0 < N < 100 0<N<1000<N<100

输出描述

输出需要做核酸检测的人数

用例

输入

5
1,2
1,1,0,1,0
1,1,0,0,0
0,0,1,0,1
1,0,0,1,0
0,0,1,0,1

输出

3

说明

编号为1、2号的人员为确诊病例
1号与0号有接触,0号与3号有接触,2号与4号有接触。所以,需要做核酸检测的人是0号、3号、4号,总计3人要进行核酸检测。

解题思路

  1. 初始化一个大小为N的布尔数组visited,用来记录每个人是否已经被访问过(即是否已经确定需要进行核酸检测)。
  2. 初始化一个大小为N×N的布尔矩阵contacts,用来表示人与人之间的接触情况。如果contacts[i][j]true,则表示编号为i的人与编号为j的人有接触。
  3. 从输入中读取确诊病例的编号,并对每个确诊病例执行深度优先搜索(DFS):
    • 在DFS中,首先将当前节点(即当前人员编号)标记为已访问。
    • 然后遍历该节点的所有邻接节点(即与当前人员有接触的所有人),如果邻接节点未被访问,则递归地对邻接节点执行DFS。
  4. 完成DFS后,遍历visited数组,统计除确诊病例外的已访问节点的数量,即为需要进行核酸检测的人数。

用例模拟计算过程:

  1. 初始化visited数组为[false, false, false, false, false]
  2. 构建contacts矩阵如下:
    [true,  true,  false, true,  false]
    [true,  true,  false, false, false]
    [false, false, true,  f
  • 22
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

算法大师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值