在迷宫中寻找最短路径 | 豆包MarsCode AI刷题

119 阅读3分钟
方向三:实践记录以及工具使用

功能亮点:深入剖析迷宫路径问题

豆包AI的刷题实践功能通过精心设计的经典问题,帮助我深入了解不同算法的应用,尤其是在复杂的搜索问题中。此题通过深度分析迷宫问题中的路径查找,提升了我对图形搜索算法的理解,特别是 BFS(广度优先搜索)和方向处理的运用。


实践案例:迷宫中的最短路径

问题描述:

小R正在玩一个迷宫游戏,游戏中给定一个 n x n 的二进制矩阵 grid,目标是从左上角 (0, 0) 到右下角 (n-1, n-1) 找到一条畅通路径。路径只能经过值为 0 的格子,并且相邻的格子必须在 8 个方向之一上连通(包括斜对角)。如果路径不存在,则返回 -1;如果存在,返回最短路径的长度。

示例:

  • 输入:grid = [[0, 1], [1, 0]]
  • 输出:2

解题思路:

这个问题可以看作是在一个图中寻找从起点到终点的最短路径。迷宫中的每个格子可以视为图中的一个节点,邻接的格子则视为边。

  1. BFS(广度优先搜索)

    • 使用广度优先搜索(BFS)来探索路径,因为 BFS 在寻找最短路径时非常高效。
    • (0, 0) 开始,探索所有相邻且值为 0 的格子,将其加入队列,并标记为已访问。
    • BFS 可以确保我们首先探索到的路径是最短的路径。
  2. 处理8个方向

    • 为了实现斜对角的连通性,需要在常规上下左右四个方向的基础上,增加四个斜对角方向。
  3. 边界检查与避免重复访问

    • 在每一步中,我们需要确保当前格子在迷宫的有效范围内,并且该格子尚未被访问过。

代码实现:

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)

实践收获:

  1. 广度优先搜索(BFS)在最短路径中的应用

    • 通过实现 BFS,我深刻理解了其在图形搜索中的优势。每次扩展最先访问的节点,确保了我们能够找到最短路径。
  2. 方向处理的灵活性

    • 通过扩展传统的四个方向为八个方向,使得搜索能够覆盖所有可能的路径,确保了我们可以处理斜对角的连通性。
  3. 优化搜索过程

    • 在每一步中,及时标记已经访问的格子,避免重复搜索,提升了效率。

总结:

通过这道迷宫路径问题,我不仅学会了如何使用 BFS 解决最短路径问题,还加深了对图形搜索算法的理解,特别是如何在实际应用中灵活处理八个方向的邻接关系。这种问题的求解方法,对于涉及网格、矩阵或图搜索的题目都有很大的参考价值,也让我在实际应用中更具信心。