当前位置:   article > 正文

迷宫问题 | 深度优先_本关任务:给定迷宫地图以及在迷宫中的起始位置,利用宽度优先搜索算法求解走出迷宫

本关任务:给定迷宫地图以及在迷宫中的起始位置,利用宽度优先搜索算法求解走出迷宫

目录

一、说明

二、步骤

三、代码

四、结果


一、说明

什么是深度优先?

        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、创建迷宫并确认起始点和终点

  1. # 创建迷宫
  2. maze_pic = [
  3. [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
  4. [1, 0, 1, 1, 0, 0, 0, 0, 1, 1],
  5. [1, 0, 0, 0, 0, 1, 1, 0, 1, 1],
  6. [1, 1, 1, 0, 0, 1, 1, 0, 1, 1],
  7. [1, 1, 1, 0, 0, 1, 1, 0, 0, 1],
  8. [1, 1, 1, 1, 0, 0, 1, 0, 0, 1],
  9. [1, 1, 1, 1, 1, 0, 0, 1, 0, 1],
  10. [1, 1, 1, 1, 1, 1, 0, 0, 0, 1],
  11. [1, 1, 1, 1, 1, 1, 0, 0, 0, 1],
  12. [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
  13. ]
  14. # 确定起点
  15. stat = (0, 0)
  16. # 确定终点,索引值从0开始,0-9=10
  17. stop = (8, 8)

2.2、取出当前节点并记录

  1. now = lst[-1]
  2. row, col = now # 取出当前节点
  3. # 9表示当前节点已走过,设置什么数字或者字母无所谓,只要不是0即可
  4. maze_pic[row][col] = 9

2.3、走出迷宫的条件并判断各个方向是否能走并记录节点

  1. if now == stop:
  2. print("迷宫已走出,走过的路线为:\n", lst)
  3. break
  4. if maze_pic[row-1][col] == 0: # 上
  5. lst.append((row-1, col)) # 记录节点
  6. continue
  7. elif maze_pic[row+1][col] == 0: # 下
  8. lst.append((row+1, col))
  9. continue
  10. elif maze_pic[row][col-1] == 0: # 左
  11. lst.append((row, col-1))
  12. continue
  13. elif maze_pic[row][col+1] == 0: # 右
  14. lst.append((row, col+1))
  15. continue
  16. else:
  17. lst.pop()

三、代码

完整代码如下:

  1. def maze_question():
  2. # 创建迷宫
  3. maze_pic = [
  4. [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
  5. [1, 0, 1, 1, 0, 0, 0, 0, 1, 1],
  6. [1, 0, 0, 0, 0, 1, 1, 0, 1, 1],
  7. [1, 1, 1, 0, 0, 1, 1, 0, 1, 1],
  8. [1, 1, 1, 0, 0, 1, 1, 0, 0, 1],
  9. [1, 1, 1, 1, 0, 0, 1, 0, 0, 1],
  10. [1, 1, 1, 1, 1, 0, 0, 1, 0, 1],
  11. [1, 1, 1, 1, 1, 1, 0, 0, 0, 1],
  12. [1, 1, 1, 1, 1, 1, 0, 0, 0, 1],
  13. [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
  14. ]
  15. # 确定起点
  16. start = (1, 1)
  17. # 确定终点,索引值从0开始,0-9=10
  18. stop = (8, 8)
  19. # 判断逻辑
  20. lst = [start]
  21. # 走过的节点不为空时才继续判断下一步
  22. i = 0 # 计数
  23. while lst:
  24. i += 1
  25. now = lst[-1]
  26. row, col = now # 取出当前节点
  27. # 9表示当前节点已走过,设置什么数字或者字母无所谓,只要不是0即可
  28. maze_pic[row][col] = 9
  29. if now == stop:
  30. print("走过节点数为:", i)
  31. print("迷宫已走出,走过的路线为:\n", lst)
  32. break
  33. if maze_pic[row-1][col] == 0: # 上
  34. lst.append((row-1, col))
  35. continue
  36. elif maze_pic[row+1][col] == 0: # 下
  37. lst.append((row+1, col))
  38. continue
  39. elif maze_pic[row][col-1] == 0: # 左
  40. lst.append((row, col-1))
  41. continue
  42. elif maze_pic[row][col+1] == 0: # 右
  43. lst.append((row, col+1))
  44. continue
  45. else:
  46. lst.pop()
  47. else:
  48. print("该迷宫无法走出")
  49. print("走过的节点个数为:", i)
  50. if __name__ == '__main__':
  51. maze_question()

四、结果

4.1、代码运行结果

结果较长,只截取了部分,如下图1:

图1

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号