Bootstrap

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

题目描述

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

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

现在给定一组确诊人员编号 (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
;