最近学习了python数据结构,做一些必要的笔记,一来是对自己学习的知识的巩固,二来对有同样问题的人有参考作用
一 情景介绍
就是给定的点,绕过障碍物,找到一条到达目标点的通路。
二 栈实现
原理:深度优先搜索,栈里存的是路径。
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 maze_path(x1,y1,x2,y2):
stack = []
stack.append((x1,y1))
maze[x1][y1] = 2
while(len(stack)>0):
curNode = stack[-1]
for dir in dirs:
# 取下一个节点
nextNode = dir(curNode[0],curNode[1])
# 如果下一个节点就是终点
if nextNode[0] == x2 and nextNode[1] == y2 and maze[x2][y2] == 0:
stack.append((x2,y2))
print("到达终点, 路径是:")
for p in stack:
print(p)
return True
else:
if maze[nextNode[0]][nextNode[1]] == 0:
stack.append(nextNode)
maze[nextNode[0]][nextNode[1]] = 2
break
else:
stack.pop()
else:
print("没有路")
return False
maze_path(1,1,1,7)
三 队列实现
原理:广度优先搜索,队列里存的是最新更新的路径节点。
重点理解:path是用来存某个节点以及某个节点是由那个节点来的。
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_r(path):
print("通路为:")
curNode = path[-1]
realpath = []
while curNode[2] != -1:
realpath.append(curNode[0:2])
curNode = path[curNode[2]]
realpath.append(curNode[0:2]) # 起点
realpath.reverse()
for node in realpath:
print(node)
def maze_path_queue(x1,y1,x2,y2):
queue = deque()
queue.append((x1,y1,-1))
path = [] # 用来记录每个节点是由哪个节点来的
while len(queue) > 0:
curNode = queue.popleft()
path.append(curNode)
for dir in dirs:
nextNode = dir(curNode[0],curNode[1])
if nextNode[0] == x2 and nextNode[1] == y2 and maze[x2][y2] == 0:
path.append((x2,y2,len(path)-1))
print_r(path)
return True
else:
if maze[nextNode[0]][nextNode[1]] == 0:
queue.append((nextNode[0],nextNode[1],len(path)-1)) # 后续节点入队,记录由哪个节点产生
maze[nextNode[0]][nextNode[1]] = 2 # 标记为已经走过
else:
print("没有路")
return False
maze_path_queue(1, 1, 1, 7)
四 总结
如有错误恳请指正,如有雷同纯属巧合