Python使用深度优先搜索解决迷宫最短路径问题

桃夭
桃夭
发布时间:2026-10-13| 6人浏览过
原创

本文介绍利用Python实现迷宫最短路径求解的算法示例。通过深度优先遍历(DFS)记录从起点到各点的最短步数,对输入二维数组进行预处理,将障碍与边界标记为-1,通行区域初始化为0。算法在遍历过程中动态更新节点步数,最终输出到达出口的最小步数及完整路径记录,适合Python初学者理解递归与状态更新逻辑。

本文通过一个具体的Python实例,详细讲解如何利用算法解决迷宫路径规划问题,内容包含完整的思路分析与代码实现,供读者参考学习。

问题描述:

给定一个 n 行 m 列的二维数组来代表迷宫地图。其中,数字 0 代表障碍物,无法通行;数字 1 代表可行走的路径。每次移动到相邻的单元格视为消耗 1 步。

解题思路:

采用深度优先遍历(DFS)算法。在遍历过程中,记录从起点到达每一个可达点的最短步数,从而确定最优路径。

初始化测试案例:

1 1 0 1 1 1 0 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1

具体处理步骤如下: 1. 在原始迷宫图的四周添加一圈值为 -1 的边界,以防止深度优先遍历过程中发生数组越界。 2. 将图中所有的障碍(原值为0)修改为 -1,将所有可通行的区域(原值为1)修改为 0,以便区分状态。 3. 在遍历过程中,若当前节点值为 0(表示未访问或可更新),则将到达该点的累计步数存储在该节点中;若节点值为 -1(障碍),则跳过不遍历;若计算出的当前步数小于节点内已存储的步数,则更新该节点的值。

修改后的迷宫矩阵:

-1 -1 -1 -1 -1 -1 -1 -1 0 0 -1 0 0 -1 -1 0 -1 0 0 0 -1 -1 0 -1 0 -1 -1 -1 -1 0 -1 0 0 0 -1 -1 0 0 0 -1 0 -1 -1 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1

外围添加的 -1 主要用于在遍历逻辑中作为边界检查,防止程序访问非法索引。

设定迷宫的入口为左上角坐标 (1, 1),出口为右上角坐标 (1, 5)(基于修改后的矩阵索引)。

Python 核心代码实现:

# -*- coding:utf-8 -*-
def init():
  global graph
  graph.append([-1,  -1, -1, -1, -1, -1,  -1])
  graph.append([-1,  0, 0, -1, 0, 0,  -1])
  graph.append([-1,  0, -1, 0, 0, 0,  -1])
  graph.append([-1,  0, -1, 0, -1, -1,  -1])
  graph.append([-1,  0, -1, 0, 0, 0,  -1])
  graph.append([-1,  0, 0, 0, -1, 0,  -1])
  graph.append([-1,  0, 0, 0, 0, 0,  -1])
  graph.append([-1,  -1, -1, -1, -1, -1,  -1])
#深度优先遍历
def deepFirstSearch( steps , x, y ):
  global graph
  current_step = steps + 1
  print(x, y, current_step )
  graph[x][y] = current_step
  next_step = current_step + 1
  '''
  遍历周围4个点:
    如果周围节点不是-1 说明 不是障碍 在此基础上:
        里面是0 说明没遍历过 我们把它修改成当前所在位置步数加1
        里面比当前的next_step大 说明不是最优方案 就修改它
        里面比当前next_step说明当前不是最优方案,不修改
  '''
  if not(x-1== 1 and y==1) and graph[x-1][y] != -1 and ( graph[x-1][y]>next_step or graph[x-1][y] ==0 ) : #左
    deepFirstSearch(current_step, x-1 , y )
  if not(x == 1 and y-1==1) and graph[x][y-1] != -1 and ( graph[x][y-1]>next_step or graph[x][y-1] ==0 ) : #上
    deepFirstSearch(current_step, x , y-1 )
  if not(x == 1 and y+1==1) and graph[x][y+1] != -1 and ( graph[x][y+1]>next_step or graph[x][y+1]==0 ) : #下
    deepFirstSearch(current_step, x , y+1 )
  if not(x+1== 1 and y==1) and graph[x+1][y] != -1 and ( graph[x+1][y]>next_step or graph[x+1][y]==0 ) : #右
    deepFirstSearch(current_step, x+1 , y )
if __name__ == "__main__":
  graph = []
  init()
  deepFirstSearch(-1,1,1)
  print(graph[1][5])

程序运行输出结果如下:

(1, 1, 0) (1, 2, 1) (2, 1, 1) (3, 1, 2) (4, 1, 3) (5, 1, 4) (5, 2, 5) (5, 3, 6) (4, 3, 7) (3, 3, 8) (2, 3, 9) (2, 4, 10) (1, 4, 11) (1, 5, 12) (2, 5, 13) (2, 5, 11) (4, 4, 8) (4, 5, 9) (5, 5, 10) (6, 5, 11) (6, 4, 12) (6, 3, 13) (6, 2, 14) (6, 1, 15) (6, 3, 7) (6, 2, 8) (6, 1, 9) (6, 4, 8) (6, 5, 9) (6, 2, 6) (6, 1, 7) (6, 1, 5) 12

补充说明:本站还提供了一款基于 JavaScript 实现的无限迷宫游戏,供读者参考交互实现:

在线迷宫小游戏地址: http://tools.jb51.net/games/migong

对 Python 其他技术感兴趣的读者,推荐查阅本站相关专题:《Python数据结构与算法教程》、《Python编码操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》以及《Python入门与进阶经典教程》。

希望本文所述的算法示例与代码解析能对读者的 Python 程序设计学习有所帮助。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。