用python写一个方法,解决一个迷宫问题:定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。入口点为[0,0],既第一格是可以走的路。 输入的内容只包含 0 \le val \le 1 \0≤val≤1 输入描述: 输入两个整数,分别表示二维数组的行数,列数。再输入相应的数组,其中的1表示墙壁,0表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。 输出描述: 左上角到右下角的最短路径,格式如样例所示。 示例1 输入: 5 5 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 复制 输出: (0,0) (1,0) (2,0) (2,1) (2,2) (2,3) (2,4) (3,4) (4,4) 复制 示例2 输入: 5 5 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 复制 输出: (0,0) (1,0) (2,0) (3,0) (4,0) (4,1) (4,2) (4,3) (4,4)
时间: 2023-06-12 09:02:03 浏览: 147
好的,以下是 Python 的代码实现:
```python
def solve_maze(n, m, maze):
# 定义起点和终点
start, end = (0, 0), (n-1, m-1)
# 定义四个方向
directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]
# 定义一个队列,用于存储待访问的节点
q = [start]
# 定义一个字典,用于记录每个节点的前一个节点
prev = {start: None}
# bfs遍历迷宫,搜索终点
while q:
curr = q.pop(0)
if curr == end:
break
for d in directions:
x, y = curr[0] + d[0], curr[1] + d[1]
if 0 <= x < n and 0 <= y < m and maze[x][y] == 0 and (x, y) not in prev:
q.append((x, y))
prev[(x, y)] = curr
# 从终点回溯到起点,得到路径
path = []
curr = end
while curr:
path.append(curr)
curr = prev[curr]
path.reverse()
# 格式化输出路径
res = ""
for p in path:
res += f"({p[0]},{p[1]}) "
return res[:-1] # 去掉最后一个空格
```
解释:首先定义起点和终点,以及四个方向和队列以及字典。然后开始进行 BFS 遍历,将待访问的节点加入队列,如果当前节点已经是终点则跳出循环,否则对当前节点的四个方向进行遍历,如果该方向上是一条可行的路径,则将该点加入队列中,并在字典 prev 中记录该节点的前一个节点。最后从终点回溯到起点,得到路径,并将路径格式化输出。
阅读全文