问题
迷宫
A
是入口
B
是出口
#
是墙
.
是通路
比如如下的迷宫:
A##############
.######.....###
.######.###...#
........###.###
#.##.##########
#.##.####....##
#.##.####.##.##
#.##.####.##.##
#.##......##.##
#.##########.##
#.....####...##
##########....B
分析
经典的迷宫解法是 深度优先遍历(dfs)广度优先遍历(bfs)
还有并发解法等许多,请自行百度之…
但现在
假设你被放入一个真的迷宫入口。
里边只有一摸一样的墙和转角
你没有携带任何工具
请问如何找到出口
有一种策略是这样的。
无论你在何处,始终遵循如下原则:
首先看能否向右走,如不能就试试向前走,
还是不行。。。。
那就试试向左,最后才试试向后。
也就是说,当别无选择的时候才退回来时的路
简要地说:
从当前朝向的右边开始,逆时针试探通路
最后只有两种结果
要么,走到了出口
要么,走回了来时的入口
代码
定义一个list代表迷宫,也就是说用一维结构表达二维结构
其换算关系很简单:
行号 = p // 宽度
列号 = p % 宽度
p = 行号 * M + 列号
定义 4 个函数 f1 f2 f3 f4
分别表示向右,向上,向左,向下
dr = [f1, f2, f3, f4] 这个方向数组代表了它们的逆时针关系
# 走迷宫问题
puz = '''
A##############
.######.....###
.######.###...#
........###.###
#.##.##########
#.##.####....##
#.##.####.##.##
#.##.####.##.##
#.##......##.##
#.##########.##
#.....####...##
##########....B
'''
puz = list(puz.replace('\n',''))
M = 15 # 宽度
N = 12 # 高度
def mi(puz, M