迷宫问题 #
- 迷宫问题问题的介绍
- 迷宫问题问题的算法分析
- 迷宫问题问题代码实现
迷宫问题问题的介绍 #
迷宫问题是典型的回溯问题,如下图的迷宫入口处在坐标的 (1,0) 出口在 (7,8)处,迷宫中黑色的部分代表是障碍物不能通过,进入迷宫的人每次只能朝四个方向没有障碍物的方向移动一步。
迷宫问题问题的算法分析 #
迷宫问题问题与跳马问题类似,不同之处在于,迷宫中有较多的障碍物,假设(x,y)表示人当前所处的位置,则下一次的移动轨迹只可能又如下四步(x表示横坐标,也表示纵坐标):
(x,y)->(x+1,y)
(x,y)->(x-1,y)
(x,y)->(x,y+1)
(x,y)->(x,y-1)
第一步:从(1,0)处出发,判断是否到达了迷宫出口,如果不是朝着一个可能的移动方向移动,记录结果,并将移动的轨迹做标记,防止下一步退回原地。
第二步:如果进入死胡同就后退一步,朝着一个另外可能的移动方向移动,一直到达迷宫出口
迷宫问题问题的代码实现 #
maze=[#迷宫的状态矩阵,0代表不能通过,1代表能通过 [0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 0, 1, 1, 1, 0, 0, 0], [0, 1, 0, 0, 0, 1, 0, 0, 0], [0, 1, 1, 0, 1, 1, 0, 0, 0], [0, 0, 1, 0, 0, 1, 1, 1, 0], [0, 1, 1, 1, 1, 1, 0, 1, 0], [0, 1, 0, 0, 0, 1, 1, 1, 0], [0, 0, 1, 1, 1, 1, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0],] res=[[1,0]]#[1,0]是迷宫的入口,作为初始的选择 maze[1][0]=0#将已经走过每一步,做上标记,下一步不能被选择 d=[[1,0],[-1,0],[0,1],[0,-1]]#迷宫中人的四种移动轨迹 def myprint(r):#按要求打印结果 for i in r: print(i,'->',sep='',end='') print('\b\b') def dfs(step): if res[step-1]==[7,8]:#如果上一步选择已经到达终点打印结果 myprint(res) return for i in d: if(maze[res[step-1][0]+i[0]][res[step-1][1]+i[1]]): [x,y]=[res[step-1][0]+i[0],res[step-1][1]+i[1]] maze[x][y]=0 res.append([x,y])#保留结果 dfs(step+1)#寻找下一步 res.pop()#撤销当前的选择 maze[x][y]=1 dfs(1)#从第一步开始寻找迷宫的出路
小结 #
- 根据迷宫问题问题,理解回溯算法试探法的含义
- 掌握迷宫问题求解的回溯算法
习题 #
- 如果在迷宫问题中,maze矩阵的索引[4,8]处也是出口,试求解所有的路径
- 如果在迷宫问题中每一步选择的结果不做标记,会发生什么情况?