语言:python
IDE:pycharm
迷宫问题,广搜
from collections import deque
maze = [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],
[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],
[1, 0, 0, 0, 0, 1, 1, 0, 0, 1],
[1, 0, 1, 1, 1, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 1, 0, 0, 0, 0, 1],
[1, 0, 1, 0, 0, 0, 1, 0, 0, 1],
[1, 0, 1, 1, 1, 0, 1, 1, 0, 1],
[1, 1, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]
dirs = [
lambda x, y: (x + 1, y),
lambda x, y: (x - 1, y),
lambda x, y: (x, y - 1),
lambda x, y: (x, y + 1)
]
def print_path(path):
curNode = path[-1]
realpath = [] # 记录真正路径的列表
while curNode[2] != -1:
realpath.append(curNode[0:2])
curNode = path[curNode[2]] # 根据关系找到之前的结点
realpath.append(curNode[0:2]) # 当找到最开始的结点时,已经不满足循环了,所以要在打印一次
realpath.reverse() # 逆置列表,反转
print(realpath) # 输出
def maze_path_queue(x1, y1, x2, y2):
queue = deque()
queue.append((x1, y1, -1)) # 将第一个坐标值以及关系入队
path = [] # 用来记录路径
while len(queue) > 0: # 如果队为空,说明已经没有路可以走
# 要分清楚队与栈的区别,如果要搜索下一节点,那么当前结点要出队
curNode = queue.pop() # 当前节点出队
path.append(curNode) # 将当前节点的加入到路径列表中
if curNode[0] == x2 and curNode[1] == y2: # 走到终点
print_path(path) # 此处要输出路径
return True
for dir1 in dirs:
nextNode = dir1(curNode[0], curNode[1])
if maze[nextNode[0]][nextNode[1]] == 0: # 说明通路
queue.append((nextNode[0], nextNode[1], len(path) - 1))
# len(path)-1作为关系,因为他是刚刚出队的坐标带进来的,出队后就进入了path列表中
maze[nextNode[0]][nextNode[1]] = 2 # 标记走过
else:
print("没有路")
return False
maze_path_queue(1, 1, 8, 8)