python给出迷宫问题: 分别使用广度优先与深度优先策略处理迷宫问题。比较路径搜索过程中 的节点扩展顺序。
时间: 2024-02-17 15:01:03 浏览: 112
好的,这是一个很有趣的问题!让我们来看看如何处理迷宫问题。首先,我们需要定义迷宫。假设我们用一个二维数组来表示迷宫,其中 0 表示可以通过的路径,1 表示墙壁,我们的目标是从起点出发,到达终点。例如,下面这个迷宫:
```
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],
]
```
其中 0 表示可以通过的路径,1 表示墙壁。起点是 (0, 0),终点是 (4, 4)。
接下来,我们分别使用广度优先和深度优先策略处理迷宫问题。
## 广度优先搜索
广度优先搜索是一种逐层扩展搜索空间的策略,从起点开始,逐层将与当前节点相邻的节点加入队列中,直到找到终点为止。
我们可以使用一个队列来存储待扩展的节点,并使用一个字典来记录节点的父节点,以便最后回溯路径。
下面是广度优先搜索的实现代码:
```python
from collections import deque
def bfs(maze, start, end):
queue = deque([start])
visited = set([start])
parent = {start: None}
while queue:
node = queue.popleft()
if node == end:
path = []
while node:
path.append(node)
node = parent[node]
return list(reversed(path))
x, y = node
for dx, dy in [(0, 1), (0, -1), (1, 0), (-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 (nx, ny) not in visited:
queue.append((nx, ny))
visited.add((nx, ny))
parent[(nx, ny)] = node
return None
```
我们从起点开始,将其加入队列中,并标记为已访问。然后,不断从队列中取出节点,判断是否为终点,如果是,则回溯路径并返回;否则,将与当前节点相邻的节点加入队列中,并标记为已访问。同时,记录节点的父节点,以便最后回溯路径。
## 深度优先搜索
深度优先搜索是一种先深入搜索空间的策略,从起点开始,不断向一个方向走到底,直到找到终点或者走到死路为止,然后回溯到上一个节点,继续搜索其他方向。
我们可以使用一个栈来存储待扩展的节点,并使用一个字典来记录节点的父节点,以便最后回溯路径。
下面是深度优先搜索的实现代码:
```python
def dfs(maze, start, end):
stack = [start]
visited = set([start])
parent = {start: None}
while stack:
node = stack.pop()
if node == end:
path = []
while node:
path.append(node)
node = parent[node]
return list(reversed(path))
x, y = node
for dx, dy in [(0, 1), (0, -1), (1, 0), (-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 (nx, ny) not in visited:
stack.append((nx, ny))
visited.add((nx, ny))
parent[(nx, ny)] = node
return None
```
我们从起点开始,将其加入栈中,并标记为已访问。然后,不断从栈中取出节点,判断是否为终点,如果是,则回溯路径并返回;否则,按照一个方向继续搜索下去,直到找到终点或者走到死路为止。如果走到死路,则回溯到上一个节点,继续搜索其他方向。同时,记录节点的父节点,以便最后回溯路径。
## 比较节点扩展顺序
在广度优先搜索中,我们逐层扩展搜索空间,先扩展距离起点为 1 的节点,再扩展距离起点为 2 的节点,以此类推。因此,节点的扩展顺序是按照距离逐层扩展的。
在深度优先搜索中,我们先深入一个方向,直到找到终点或者走到死路为止,然后回溯到上一个节点,继续搜索其他方向。因此,节点的扩展顺序是按照深度优先的顺序扩展的。
因此,广度优先搜索和深度优先搜索的节点扩展顺序是不同的。在某些情况下,节点扩展顺序可能会影响搜索效率,因此我们需要根据实际情况选择合适的搜索策略。
阅读全文