python给定一个MN的迷宫图,求一条从指定入口到出口的路径使用栈编写代码
时间: 2024-06-11 14:07:07 浏览: 146
用栈的方式实现迷宫的路径求解
5星 · 资源好评率100%
假设迷宫图是一个二维数组maze,其中0表示通路,1表示障碍物,起点的坐标是(start_x, start_y),终点的坐标是(end_x, end_y),则可以使用深度优先搜索(DFS)和栈来寻找路径。
具体实现步骤如下:
1. 定义一个栈stack,将起点坐标(start_x, start_y)压入栈中。
2. 定义一个二维数组visited,用于记录每个位置是否已经被访问过,初始值为False。
3. 当栈不为空时,取出栈顶元素(x, y),判断是否为终点,如果是,则返回路径;如果不是,则继续执行下面的步骤。
4. 标记当前位置为已访问,即visited[x][y]=True。
5. 判断当前位置的四个方向是否为通路,如果是,则将该方向的坐标压入栈中。
6. 重复步骤3-5,直到找到终点或栈为空。
7. 如果栈为空仍未找到终点,则返回空列表表示路径不存在。
下面是具体的代码实现:
```python
def findPath(maze, start_x, start_y, end_x, end_y):
stack = [(start_x, start_y)] # 初始化栈,将起点压入栈中
visited = [[False]*len(maze[0]) for _ in range(len(maze))] # 初始化visited数组
visited[start_x][start_y] = True # 标记起点为已访问
while stack:
x, y = stack.pop() # 取出栈顶元素
if x == end_x and y == end_y: # 判断是否为终点
return getPath(start_x, start_y, end_x, end_y, visited) # 返回路径
for dx, dy in [(0, 1), (1, 0), (0, -1), (-1, 0)]: # 遍历四个方向
nx, ny = x+dx, y+dy
if 0 <= nx < len(maze) and 0 <= ny < len(maze[0]) and maze[nx][ny] == 0 and not visited[nx][ny]:
stack.append((nx, ny)) # 将该方向的坐标压入栈中
visited[nx][ny] = True # 标记该位置为已访问
return [] # 栈为空,表示路径不存在
def getPath(start_x, start_y, end_x, end_y, visited):
path = [(end_x, end_y)]
while path[-1] != (start_x, start_y):
x, y = path[-1]
for dx, dy in [(0, 1), (1, 0), (0, -1), (-1, 0)]:
nx, ny = x+dx, y+dy
if 0 <= nx < len(visited) and 0 <= ny < len(visited[0]) and visited[nx][ny]:
path.append((nx, ny))
break
return list(reversed(path)) # 返回路径
```
使用示例:
```python
maze = [[0, 1, 0, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 1, 0]]
start_x, start_y = 0, 0
end_x, end_y = 4, 4
path = findPath(maze, start_x, start_y, end_x, end_y)
print(path) # 输出[(0, 0), (1, 0), (2, 0), (2, 1), (2, 2), (2, 3), (3, 3), (4, 3), (4, 4)]
```
上述代码中,getPath函数用于从visited数组中获取路径,具体实现是从终点开始,依次向四周扩展,找到第一个已访问的位置,将其加入路径中,并继续向该位置扩展,直到起点为止。最后需要将路径反转,因为是从终点往起点扩展的。
阅读全文