刷题分享|豆包MarsCode AI刷题

8 阅读5分钟

309.魔幻世界中的安全区计算

问题描述 小F被神秘力量带入了一个魔幻世界,这里危机四伏。为了在异世界中生存,小F需要找到安全区。异世界可以被表示为一个大小为 n x m 的二维数组,每个格子的值代表该位置的危险程度。 小F的能力值为 X,当某个格子的危险程度小于等于 X 时,这个格子是安全的。如果多个安全的格子相邻(上下左右连通),它们可以构成一个安全区。你需要帮助小F计算出一共有多少个安全区。

测试样例

样例1:

输入:n = 3, m = 3, X = 4, a = [[2, 3, 3], [3, 3, 3], [3, 3, 3]]

输出:1

样例2:

输入:n = 2, m = 2, X = 5, a = [[6, 6], [6, 4]]

输出:1

样例3:

输入:n = 3, m = 3, X = 3, a = [[1, 2, 2], [2, 3, 3], [3, 4, 5]]

输出:1 ————————————————————

(一)分析与实现:计算安全区的数量

在这个问题中,我们需要帮助小F在一个充满危险的魔幻世界中找到安全区。这个世界被表示为一个二维数组,其中每个格子的值代表该位置的危险程度。小F的能力值为X,当某个格子的危险程度小于等于X时,该格子被认为是安全的。我们的目标是计算出这个二维数组中有多少个安全区。

问题分析

1.输入与输出

输入:

1.n:二维数组的行数

2.m:二维数组的列数

3.X:小F的能力值

4.a:一个大小为 n x m 的二维数组,表示每个格子的危险程度

输出:

返回安全区的数量

(二)安全区的定义

安全区是由多个相邻的安全格子(上下左右连通)组成的区域。我们需要通过遍历整个数组,找到所有的安全区。每当我们找到一个新的安全格子时,就可以通过深度优先搜索(DFS)来标记所有与之相连的安全格子。

(三)深度优先搜索(DFS)

DFS是一种用于遍历或搜索树或图的算法。它从一个节点开始,尽可能深地搜索每一个分支,直到没有未访问的节点为止。在本题中,我们可以利用DFS来访问所有相邻的安全格子。

(四)代码实现

以下是实现该功能的Python代码:


def solution(n: int, m: int, X: int, a: list[list[int]]) -> int:

def dfs(x, y):

# 如果超出边界或当前格子不安全,返回

if x < 0 or x >= n or y < 0 or y >= m or a[x][y] > X or visited[x][y]:

return

# 标记当前格子为已访问

visited[x][y] = True

# 进行深度优先搜索,访问上下左右的格子

dfs(x + 1, y)

dfs(x - 1, y)

dfs(x, y + 1)

dfs(x, y - 1)

visited = [[False] * m for _ in range(n)] # 创建访问标记数组

safe_zone_count = 0 # 安全区计数

for i in range(n):

for j in range(m):

if a[i][j] <= X and not visited[i][j]: # 找到一个新的安全区

dfs(i, j) # 从这个格子开始深度优先搜索

safe_zone_count += 1 # 增加安全区计数

return safe_zone_count # 返回安全区的数量

if __name__ == '__main__':

print(solution(3, 3, 4, [[2, 3, 3], [3, 3, 3], [3, 3, 3]]) == 1)

print(solution(2, 2, 5, [[6, 6], [6, 4]]) == 1)

print(solution(3, 3, 3, [[1, 2, 2], [2, 3, 3], [3, 4, 5]]) == 1)

(五)代码解析

  1. DFS函数:dfs(x, y)用于递归访问安全格子。它首先检查当前格子是否超出边界、是否安全以及是否已被访问。如果满足条件,则标记为已访问,并递归访问上下左右的格子。

  2. 访问标记数组:visited是一个与输入数组同样大小的布尔数组,用于记录哪些格子已经被访问过。

  3. 安全区计数:safe_zone_count用于记录找到的安全区数量。我们遍历整个数组,当发现一个新的安全格子时,调用DFS并增加计数。

  4. 主函数:在__main__中,我们通过几个测试用例来验证代码的正确性。

(六)注意事项

1.边界条件:在实现DFS时,必须确保不访问超出数组边界的格子。

2.性能考虑:DFS的时间复杂度为O(n * m),在最坏情况下,每个格子都需要被访问一次。对于较大的数组,可能需要考虑优化算法或使用其他搜索策略。

(七)心得与体会

通过这个问题,我深刻体会到算法设计的重要性。尤其是在处理图形或网格问题时,选择合适的搜索策略(如DFS或BFS)能够显著影响代码的简洁性和效率。此外,边界条件的处理也是编程中常见的挑战之一,细心的检查和测试可以避免许多潜在的错误。

(八)实际生活的应用

这个问题的解决方案在实际生活中有广泛的应用。例如,在地图导航中,我们可以使用类似的算法来寻找安全路径或避开危险区域。在网络安全中,类似的算法可以用于检测网络中的安全区域,帮助识别潜在的攻击路径。

总之,通过这个问题的分析与实现,我们不仅掌握了DFS的应用,还提高了对算法设计和边界条件处理的理解。这些技能在未来的编程和算法学习中将大有裨益。