题目解析:魔幻世界中的安全区计算 | 豆包MarsCode AI刷题
## 1. 思路 在这个问题中,我们需要在一个 n x m 的二维数组中找到所有危险程度不超过 X 的安全区域。安全区域是由相邻的安全格子(上下左右连通)组成的。我们可以使用深度优先搜索(DFS)来遍历每个安全格子,并标记已经访问过的格子,以避免重复计算。
## 2. 图解 假设我们有以下输入:
n = 3, m = 3, X = 4 a = [[2, 3, 3], [3, 3, 3], [3, 3, 3]]
我们可以画出如下图解:
初始矩阵:
2 3 3
3 3 3
3 3 3
安全区域(危险程度 <= 4):
S S S
S S S
S S S
最终结果:1个安全区域
3. 代码详解 python
def solution(n: int, m: int, X: int, a: list[list[int]]) -> int: # Directions for moving up, down, left, right directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
def is_safe(x, y): return 0 <= x < n and 0 <= y < m and a[x][y] <= X def dfs(x, y): stack = [(x, y)] while stack: cx, cy = stack.pop() for dx, dy in directions: nx, ny = cx + dx, cy + dy if is_safe(nx, ny) and not visited[nx][ny]: visited[nx][ny] = True stack.append((nx, ny)) visited = [[False] * m for _ in range(n)] safe_area_count = 0 for i in range(n): for j in range(m): if is_safe(i, j) and not visited[i][j]: # Found a new safe area visited[i][j] = True dfs(i, j) safe_area_count += 1 return safe_area_countif name == 'main': print(solution(3, 3, 4, [[2, 3, 3], [3, 3, 3], [3, 3, 3]]) == 1) # Expected output: 1 print(solution(2, 2, 5, [[6, 6], [6, 4]]) == 1) # Expected output: 1 print(solution(3, 3, 3, [[1, 2, 2], [2, 3, 3], [3, 4, 5]]) == 1) # Expected output: 1
代码解释 定义方向:directions 列表定义了四个移动方向(上、下、左、右)。 判断安全性:is_safe 函数用于判断一个格子是否是安全的(即危险程度小于等于 X 且在矩阵范围内)。 深度优先搜索(DFS):dfs 函数使用栈实现深度优先搜索,遍历所有相邻的安全格子,并标记为已访问。 初始化访问矩阵:visited 矩阵用于记录每个格子是否已被访问。 遍历矩阵:双重循环遍历整个矩阵,对于每个未访问且安全的格子,启动一次 DFS,计数器 safe_area_count 增加。
4. 知识总结
- 深度优先搜索(DFS)
定义:深度优先搜索是一种用于遍历或搜索树或图的算法。它从根节点开始,沿着树的分支尽可能深地搜索,直到无法继续为止,然后回溯。
实现方式: 递归:通过递归调用实现,简单直观。 栈:使用显式栈来模拟递归过程,适合处理递归深度较大的情况。
应用场景: 图的遍历 迷宫求解 棋盘问题 组合问题 注意事项: 需要记录访问状态,避免重复访问导致死循环。 注意边界条件,防止数组越界。
- 二维数组遍历
定义:二维数组是一个矩阵,通常用于表示平面或表格数据。
遍历方式: 逐行遍历:从上到下,从左到右依次访问每个元素。 逐列遍历:从左到右,从上到下依次访问每个元素。
应用场景: 图像处理 地图问题 游戏棋盘 注意事项: 确保遍历范围正确,避免越界。 可以使用嵌套循环实现遍历。
- 边界条件处理
定义:在处理数组、字符串等数据结构时,需要特别注意边界条件,避免数组越界或逻辑错误。
常见场景: 数组索引 字符串切片 循环条件
处理方法: 使用条件语句检查索引是否在有效范围内。 使用 try-except 块捕获异常。 提前计算边界值,减少重复检查。
- 状态标记
定义:在某些算法中,需要记录某些状态,以避免重复计算或进入无限循环。
实现方式: 布尔数组:使用布尔数组记录每个元素是否已被访问。 字典:使用字典记录状态及其相关信息。
应用场景: 图的遍历 动态规划 回溯算法
注意事项: 初始化状态标记时,确保所有状态都设置为未访问。 更新状态标记时,确保操作正确无误。
通过以上方法,相信大家可以更高效地掌握算法知识,提高编程能力。希望这些经验和建议对大家有所帮助!