题解 | #迷宫问题#
迷宫问题
https://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc
# 定义一个用来在迷宫中找路径的函数
def bfs(maze):
# 获取迷宫的行数和列数
m, n = len(maze), len(maze[0])
# 如果迷宫是空的,就没有路径
if m == 0 or n == 0:
return []
# 准备一个队列,开始时只有起点在里面
queue = [(0, 0, [(0, 0)])]
# 记录我们访问过的地方,开始时只有起点
visited = set([(0, 0)])
# 当队列不为空时,继续寻找路径
while queue:
# 从队列中取出一个位置和到这个位置的路径
row, col, path = queue.pop(0)
# 如果这个位置是出口,就找到了路径
if (row, col) == (m - 1, n - 1):
return path
# 尝试向上下左右四个方向移动
for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
# 计算移动后的位置
next_row, next_col = row + dx, col + dy
# 如果新位置有效,并且没有被墙挡住,并且没有访问过
if (
0 <= next_row < m
and 0 <= next_col < n
and maze[next_row][next_col] == 0
and (next_row, next_col) not in visited
):
# 将新位置和到达新位置的路径加入队列
queue.append((next_row, next_col, path + [(next_row, next_col)]))
# 标记新位置为已访问
visited.add((next_row, next_col))
# 如果走遍了所有可能的路都没有找到出口,就返回空列表
return []
# 不停地读取输入,直到没有更多数据
while True:
try:
# 读取迷宫的行数和列数
m, n = map(int, input().split())
maze = []
# 根据行数读取迷宫数据
for _ in range(m):
row = list(map(int, input().split()))
maze.append(row)
# 使用BFS方法找路径
path = bfs(maze)
# 打印找到的路径
for step in path:
print(f"({step[0]},{step[1]})")
# 如果读取数据时出错(例如没有更多数据了),就结束程序
except EOFError:
break
查看4道真题和解析