问题
用一个二维数组表示一个简单的迷宫,用0表示通路,用1表示阻断,
老鼠在每个点上可以移动到相邻的东南西北四个点,设计一个算法,
模拟老鼠走迷宫,找到入口到出口的一条路径
例如:
1,1,1,1,1,1,1
入口-> 0,0,1,0,1,1
1,1,0,0,0,1,1
1,0,0,1,1,0,1
1,0,1,0,0,0,1
1,0,0,0,1,0 ->出口
1,1,1,1,1,1,1
算法:
1.用一个栈来记录老鼠从入口到出口的路径.
2.走到某点后,将该点坐标压栈,并把该点值置为1,表示走过了.
3.从临近的四个点中可到达的点中任意选取一个,走到该点.
4.如果在到达某点后邻近的4个点都不能走,说明已经走入死胡同.
此时退栈,退后一步尝试其它点.
5.反复执行(2),(3),(4)直到找到出口.(空栈代表没有出口)
Python代码示例
初始化迷宫
def initMaze():
'''
初始化迷宫
:return:
'''
# 构造7*7的二维数组
maze = [[0] * 7 for _ in xrange(5 + 2)]
# 迷宫内部的墙
walls = [
(1, 3),
(2, 1), (2, 5),
(3, 3), (3, 4),
(4, 2), #(4, 3), 没有路径
(5, 4),
]
# 四周为1
for i in xrange(5 + 2):
maze[i][0] = maze[i][-1] = 1
maze[0][i] = maze[-1][i] = 1
# 设置墙为1
for i, j in walls:
maze[i][j] = 1
return maze
路径算法
def path(maze, start, end):
'''
路径
:param maze:迷宫
:param start: 入口
:param end: 出口
:return:
'''
i, j = start
ei, ej = end
# 当前在入口,且走过,置为1
s = [(i, j)]
maze[i][j] = 1
while s:
# 栈顶表示当前的点
i, j = s[-1]
# 找到出口
if(i, j)== (ei, ej):
break
# 从临近的4个点探测
for di, dj in [(0, -1), (0, 1), (-1, 0), (1, 0)]:
# i + di,j + dj 下一个点
if maze[i + di][j + dj] == 0:
# 压栈,并置为1
maze[i + di][j + dj] = 1
s.append((i + di, j + dj))
break
else:
# 遇到死胡同
s.pop()
return s
执行函数
maze = initMaze()
print path(maze, (1, 1), (5, 5))
结果
[(1, 1), (1, 2), (2, 2), (3, 2), (3, 1), (4, 1), (5, 1), (5, 2), (5, 3), (4, 3), (4, 4), (4, 5), (5, 5)]