方法:
1.确定起点,起点出队的同时往四个方向搜索,可以走的节点入队;
2.满足条件的进行标记,表示已经搜索过;
3.直到搜到终点为止,输出路径。
代码:
##队列解决迷宫问题
##对比栈的优势:能解决最短路径问题。
from collections import deque
dirs=[
lambda x,y:(x-1,y),
lambda x,y:(x,y+1),
lambda x,y:(x+1,y),
lambda x,y:(x,y-1)
]
def print_path(path):##输出真实路径
now_node=path[-1]
real_path=[]
while now_node[2]!=-1:
real_path.append(now_node[:2])
now_node=path[now_node[2]]
real_path.append(now_node[:2])
real_path.reverse()
for path in real_path:
print(path)
def maze_queue(l,x1,y1,x2,y2):
queue=deque()
queue.append((x1,y1,-1))##建立三元素元组,坐标和源节点索引
path=[]##保存走过的节点
while len(queue)>0:##当队列有节点的时候都要搜索,直到走到终点为止
now_node=queue.popleft()
path.append(now_node)
if now_node[0]==x2 and now_node[1]==y2:##找到终点
print_path(path)
return True
for dir in dirs:
next_node=dir(now_node[0],now_node[1])
if l[next_node[0]][next_node[1]]==0:
queue.append((next_node[0],next_node[1],len(path)-1))
l[next_node[0]][next_node[1]] = 2
else:
l[now_node[0]][now_node[1]] = 2
else:
print("世界上本来没有路,但是走的人多了便有了路!")
return False
if __name__ == '__main__':
l=[
[1,1,1,1,1,1,1],
[1,0,0,0,0,0,1],
[1,0,0,0,1,1,1],
[1,1,1,1,1,1,1]
]
maze_queue(l,1,1,2,1)