方向三:实践记录以及工具使用
功能亮点:深入剖析迷宫路径问题
豆包AI的刷题实践功能通过精心设计的经典问题,帮助我深入了解不同算法的应用,尤其是在复杂的搜索问题中。此题通过深度分析迷宫问题中的路径查找,提升了我对图形搜索算法的理解,特别是 BFS(广度优先搜索)和方向处理的运用。
实践案例:迷宫中的最短路径
问题描述:
小R正在玩一个迷宫游戏,游戏中给定一个 n x n 的二进制矩阵 grid,目标是从左上角 (0, 0) 到右下角 (n-1, n-1) 找到一条畅通路径。路径只能经过值为 0 的格子,并且相邻的格子必须在 8 个方向之一上连通(包括斜对角)。如果路径不存在,则返回 -1;如果存在,返回最短路径的长度。
示例:
- 输入:
grid = [[0, 1], [1, 0]] - 输出:
2
解题思路:
这个问题可以看作是在一个图中寻找从起点到终点的最短路径。迷宫中的每个格子可以视为图中的一个节点,邻接的格子则视为边。
-
BFS(广度优先搜索) :
- 使用广度优先搜索(BFS)来探索路径,因为 BFS 在寻找最短路径时非常高效。
- 从
(0, 0)开始,探索所有相邻且值为 0 的格子,将其加入队列,并标记为已访问。 - BFS 可以确保我们首先探索到的路径是最短的路径。
-
处理8个方向:
- 为了实现斜对角的连通性,需要在常规上下左右四个方向的基础上,增加四个斜对角方向。
-
边界检查与避免重复访问:
- 在每一步中,我们需要确保当前格子在迷宫的有效范围内,并且该格子尚未被访问过。
代码实现:
python
复制代码
from collections import deque
def solution(grid: list) -> int:
n = len(grid)
if grid[0][0] == 1 or grid[n-1][n-1] == 1:
return -1
directions = [(-1, 0), (1, 0), (0, -1), (0, 1), (-1, -1), (-1, 1), (1, -1), (1, 1)]
queue = deque([(0, 0, 1)]) # Start from (0, 0) with path length 1
grid[0][0] = 1 # Mark the start point as visited
while queue:
row, col, path_length = queue.popleft()
if row == n-1 and col == n-1:
return path_length # Found the path to the bottom-right corner
for dr, dc in directions:
new_row, new_col = row + dr, col + dc
if 0 <= new_row < n and 0 <= new_col < n and grid[new_row][new_col] == 0:
queue.append((new_row, new_col, path_length + 1))
grid[new_row][new_col] = 1 # Mark as visited
return -1 # If no path found
if __name__ == '__main__':
print(solution(grid=[[0, 1], [1, 0]]) == 2)
print(solution(grid=[[0, 0, 0], [1, 1, 0], [1, 1, 0]]) == 4)
print(solution(grid=[[1, 0, 0], [1, 1, 0], [1, 1, 0]]) == -1)
实践收获:
-
广度优先搜索(BFS)在最短路径中的应用:
- 通过实现 BFS,我深刻理解了其在图形搜索中的优势。每次扩展最先访问的节点,确保了我们能够找到最短路径。
-
方向处理的灵活性:
- 通过扩展传统的四个方向为八个方向,使得搜索能够覆盖所有可能的路径,确保了我们可以处理斜对角的连通性。
-
优化搜索过程:
- 在每一步中,及时标记已经访问的格子,避免重复搜索,提升了效率。
总结:
通过这道迷宫路径问题,我不仅学会了如何使用 BFS 解决最短路径问题,还加深了对图形搜索算法的理解,特别是如何在实际应用中灵活处理八个方向的邻接关系。这种问题的求解方法,对于涉及网格、矩阵或图搜索的题目都有很大的参考价值,也让我在实际应用中更具信心。