赞
踩
目录
什么是深度优先?
DFS即Depth First Search,深度优先搜索属于图算法的一种,是一个针对图和树的遍历算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,一般用堆数据结构来辅助实现DFS算法。其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。
本文通过对10*10迷宫问题的解决,理解深度优先的代码逻辑策略。
操作系统:win 10
编辑器:pycharm edu
语言及版本:python 3.10
解决的问题:迷宫
使用的算法:深度优先
迷宫复杂度:10*10
替代迷宫:列表(1代表墙壁,0代表通道,即1不能走,0可以走)
存储容器:栈(python中的列表可实现栈的功能,先进后出)
可走出迷宫路线数量:2
迷宫图:
[
[0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 1, 1, 0, 0, 0, 0, 1, 1],
[1, 0, 0, 0, 0, 1, 1, 0, 1, 1],
[1, 1, 1, 0, 0, 1, 1, 0, 1, 1],
[1, 1, 1, 0, 0, 1, 1, 0, 0, 1],
[1, 1, 1, 1, 0, 0, 1, 0, 0, 1],
[1, 1, 1, 1, 1, 0, 0, 1, 0, 1],
[1, 1, 1, 1, 1, 1, 0, 0, 0, 1],
[1, 1, 1, 1, 1, 1, 0, 1, 0, 1],
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0],
]
逻辑:
先确定当前节点,在判断当前节点上下左右是否是墙壁(要去除掉之前走过的节点,避免走死循环),往上下左右的优先级看实际情况,不是墙壁即把这个点入栈,并把这个当做当前节点,循环反复,直到当前点坐标等于终点坐标即为走出迷宫;
如何判断迷宫是否可以走出?
1)若迷宫可以走出,则当前节点坐标等于终点坐标;
2)若迷宫无法走出,则记录坐标的容器为空;
注意:当走到某一条死路进行后退时,要把回退的节点出栈,直到下一条路线为止;
2.1、创建迷宫并确认起始点和终点
- # 创建迷宫
- maze_pic = [
- [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
- [1, 0, 1, 1, 0, 0, 0, 0, 1, 1],
- [1, 0, 0, 0, 0, 1, 1, 0, 1, 1],
- [1, 1, 1, 0, 0, 1, 1, 0, 1, 1],
- [1, 1, 1, 0, 0, 1, 1, 0, 0, 1],
- [1, 1, 1, 1, 0, 0, 1, 0, 0, 1],
- [1, 1, 1, 1, 1, 0, 0, 1, 0, 1],
- [1, 1, 1, 1, 1, 1, 0, 0, 0, 1],
- [1, 1, 1, 1, 1, 1, 0, 0, 0, 1],
- [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
- ]
- # 确定起点
- stat = (0, 0)
- # 确定终点,索引值从0开始,0-9=10
- stop = (8, 8)

2.2、取出当前节点并记录
- now = lst[-1]
- row, col = now # 取出当前节点
- # 9表示当前节点已走过,设置什么数字或者字母无所谓,只要不是0即可
- maze_pic[row][col] = 9
2.3、走出迷宫的条件并判断各个方向是否能走并记录节点
- if now == stop:
- print("迷宫已走出,走过的路线为:\n", lst)
- break
- if maze_pic[row-1][col] == 0: # 上
- lst.append((row-1, col)) # 记录节点
- continue
- elif maze_pic[row+1][col] == 0: # 下
- lst.append((row+1, col))
- continue
- elif maze_pic[row][col-1] == 0: # 左
- lst.append((row, col-1))
- continue
- elif maze_pic[row][col+1] == 0: # 右
- lst.append((row, col+1))
- continue
- else:
- lst.pop()

完整代码如下:
-
-
- def maze_question():
- # 创建迷宫
- maze_pic = [
- [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
- [1, 0, 1, 1, 0, 0, 0, 0, 1, 1],
- [1, 0, 0, 0, 0, 1, 1, 0, 1, 1],
- [1, 1, 1, 0, 0, 1, 1, 0, 1, 1],
- [1, 1, 1, 0, 0, 1, 1, 0, 0, 1],
- [1, 1, 1, 1, 0, 0, 1, 0, 0, 1],
- [1, 1, 1, 1, 1, 0, 0, 1, 0, 1],
- [1, 1, 1, 1, 1, 1, 0, 0, 0, 1],
- [1, 1, 1, 1, 1, 1, 0, 0, 0, 1],
- [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
- ]
- # 确定起点
- start = (1, 1)
- # 确定终点,索引值从0开始,0-9=10
- stop = (8, 8)
- # 判断逻辑
- lst = [start]
- # 走过的节点不为空时才继续判断下一步
- i = 0 # 计数
- while lst:
- i += 1
- now = lst[-1]
- row, col = now # 取出当前节点
- # 9表示当前节点已走过,设置什么数字或者字母无所谓,只要不是0即可
- maze_pic[row][col] = 9
- if now == stop:
- print("走过节点数为:", i)
- print("迷宫已走出,走过的路线为:\n", lst)
- break
- if maze_pic[row-1][col] == 0: # 上
- lst.append((row-1, col))
- continue
- elif maze_pic[row+1][col] == 0: # 下
- lst.append((row+1, col))
- continue
- elif maze_pic[row][col-1] == 0: # 左
- lst.append((row, col-1))
- continue
- elif maze_pic[row][col+1] == 0: # 右
- lst.append((row, col+1))
- continue
- else:
- lst.pop()
- else:
- print("该迷宫无法走出")
- print("走过的节点个数为:", i)
-
-
- if __name__ == '__main__':
- maze_question()

4.1、代码运行结果
结果较长,只截取了部分,如下图1:
图1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。