笔记如下:
问题理解
这个问题可以看作是一个广度优先搜索(BFS)的变种问题。我们需要计算病毒从一个初始感染者开始,传播到整个房间内所有人的最短时间。房间是一个二维网格,每个座位上的人可能戴口罩也可能不戴口罩。戴口罩的人需要更长的时间才能被感染。
数据结构选择
- 二维网格(seats) :表示房间的座位布局,其中
0表示戴口罩的人,1表示未戴口罩的人。 - 队列(queue) :用于BFS,存储当前时间步内所有被感染的座位。
- 访问标记(visited) :记录每个座位是否已经被感染,避免重复处理。
算法步骤
-
初始化:
- 将初始感染者的位置加入队列,并标记为已访问。
- 记录当前时间步为0。
-
BFS循环:
-
从队列中取出当前时间步的所有感染者。
-
对于每个感染者,检查其四个相邻座位(上、下、左、右)。
-
如果相邻座位上的人未戴口罩(值为1),则立即感染,并将其加入队列。
-
如果相邻座位上的人戴口罩(值为0),则需要额外的时间才能感染。
- 如果当前时间步是偶数,则需要等待到下一个时间步才能感染。
- 如果当前时间步是奇数,则需要等待到下下个时间步才能感染。
-
更新时间步,并继续循环,直到队列为空。
-
-
终止条件:
- 当队列为空时,表示所有可能被感染的座位都已经被处理。
- 返回当前时间步作为结果。
收获总结
通过解决这个问题,我们可以学到以下几点:
-
广度优先搜索(BFS)的应用:
- BFS是一种非常适合解决最短路径问题的算法。在这个问题中,我们使用BFS来计算病毒传播到所有人的最短时间。
- BFS通过逐层扩展的方式,确保我们能够找到最短的路径。
-
多源BFS:
- 在这个问题中,初始感染者可以看作是BFS的多个起始点。我们可以将所有初始感染者同时加入队列,从而实现多源BFS。
-
状态管理:
- 在BFS中,我们需要管理每个节点的状态(是否被访问过),以避免重复处理。
- 在这个问题中,我们使用一个二维数组来记录每个座位的感染状态。
-
时间复杂度的优化:
- 通过合理选择数据结构和算法,我们可以优化时间复杂度。在这个问题中,BFS的时间复杂度为O(n * m),其中n和m分别是行数和列数。
-
边界条件的处理:
- 在处理二维网格问题时,我们需要特别注意边界条件的处理。例如,在检查相邻座位时,需要确保不越界。
-
问题的抽象与建模:
- 将实际问题抽象为图论问题,并选择合适的算法来解决,是解决复杂问题的关键。在这个问题中,我们将房间的座位布局抽象为一个二维网格,并使用BFS来解决病毒传播问题。
通过了此次的刷题和笔记总结,我收获满满 相信自己的努力一定不会白费的