深度优先搜索(DFS)在二维数组中的应用
问题背景
在解决某些问题时,我们需要在一个二维数组中找到所有连通的区域。例如,在一个表示危险程度的二维数组中,我们需要找到所有危险程度小于等于某个阈值的连通区域。这种问题通常可以通过深度优先搜索(DFS)或广度优先搜索(BFS)来解决。
数据结构选择
- 二维数组
a:用于存储每个格子的危险程度。 - 布尔类型的二维数组
visited:用于记录哪些格子已经被访问过,避免重复访问。
算法步骤
-
初始化:
- 创建一个与输入数组
a相同大小的布尔数组visited,并将其所有元素初始化为False。 - 初始化一个计数器
safe_zones,用于记录安全区的数量。
- 创建一个与输入数组
-
遍历二维数组:
- 使用双重循环遍历二维数组
a的每一个格子。 - 对于每个格子,如果其危险程度小于等于阈值
X且未被访问过,则从这个格子开始进行 DFS 搜索。
- 使用双重循环遍历二维数组
-
DFS 实现:
- 从当前格子开始,递归地访问其上下左右四个方向的相邻格子。
- 在每次递归中,检查边界条件(是否越界)和是否已经访问过。
- 如果相邻格子是安全的且未被访问过,则继续递归。
- 在每次递归中,标记当前格子为已访问。
-
计数安全区:
- 每次从新的未访问过的安全格子开始 DFS 时,计数器
safe_zones加一。
- 每次从新的未访问过的安全格子开始 DFS 时,计数器
代码示例
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 visited[x][y] or a[x][y] > X:
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_zones = 0
# 遍历整个二维数组
for i in range(n):
for j in range(m):
if a[i][j] <= X and not visited[i][j]:
# 找到一个新的安全区
safe_zones += 1
dfs(i, j)
return safe_zones
总结
- DFS 是一种递归的搜索算法,适用于在二维数组中寻找连通区域。
- visited 数组 用于避免重复访问,提高效率。
- 边界检查 是确保递归不会越界的关键步骤。
通过上述步骤和代码示例,我们可以有效地计算出二维数组中所有连通的安全区域的数量。