迷宫寻路算法:非递归栈实现,寻找所有路径和最短路径
迷宫寻路算法:非递归栈实现,寻找所有路径和最短路径
本文将介绍使用非递归栈实现的迷宫寻路算法,代码示例展示如何找到所有路径并最终确定最短路径。
问题描述
给定一个 m×n 的长方阵表示迷宫,0 和1 分别表示迷宫中的通路和障碍。设计一个程序,对于任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
算法思想
- 首先将迷宫的起点入栈,并标记为已访问。
- 如果栈不为空,则取出栈顶元素,判断是否为终点,如果是则得到一条通路,将通路存储起来。
- 如果栈顶元素不是终点,则将其周围的未访问的通路入栈,并标记为已访问。
- 重复步骤2和步骤3,直到找到一条通路或者栈为空。
代码实现
class StackNode:
def __init__(self, x, y):
self.x = x
self.y = y
self.next = None
class Stack:
def __init__(self):
self.top = None
def is_empty(self):
return self.top is None
def push(self, x, y):
node = StackNode(x, y)
if self.is_empty():
self.top = node
else:
node.next = self.top
self.top = node
def pop(self):
if self.is_empty():
return None
else:
node = self.top
self.top = self.top.next
return node.x, node.y
def find_path(maze):
if maze is None or len(maze) == 0 or len(maze[0]) == 0:
return None
m = len(maze)
n = len(maze[0])
visited = [[False] * n for _ in range(m)]
stack = Stack()
stack.push(0, 0)
visited[0][0] = True
paths = []
while not stack.is_empty():
x, y = stack.pop()
if x == m-1 and y == n-1:
paths.append((x, y))
break
paths.append((x, y))
if x+1 < m and maze[x+1][y] == 0 and not visited[x+1][y]:
stack.push(x+1, y)
visited[x+1][y] = True
elif y+1 < n and maze[x][y+1] == 0 and not visited[x][y+1]:
stack.push(x, y+1)
visited[x][y+1] = True
elif x-1 >= 0 and maze[x-1][y] == 0 and not visited[x-1][y]:
stack.push(x-1, y)
visited[x-1][y] = True
elif y-1 >= 0 and maze[x][y-1] == 0 and not visited[x][y-1]:
stack.push(x, y-1)
visited[x][y-1] = True
else:
paths.pop()
return paths
maze = [
[0, 1, 1, 1, 1],
[0, 0, 0, 1, 1],
[1, 1, 0, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 0]
]
paths = find_path(maze)
# 判断是否有通路
if paths is not None and len(paths) > 0:
print('迷宫中存在通路:')
for path in paths:
print(path)
# 找到最短路径
shortest_path = paths[0]
for path in paths:
if len(path) < len(shortest_path):
shortest_path = path
print('迷宫中最短路径:', shortest_path)
else:
print('迷宫中不存在通路')
总结
本文介绍了使用非递归栈实现的迷宫寻路算法,并给出了完整的代码示例,包括寻找所有路径和最短路径的功能。该算法思路清晰,易于理解和实现,对于理解迷宫寻路算法的原理和应用具有很好的参考价值。
原文地址: https://www.cveoy.top/t/topic/qz6s 著作权归作者所有。请勿转载和采集!