📅  最后修改于: 2023-12-03 15:28:20.552000             🧑  作者: Mango
迷宫 CSES 是 CSES 题库中的一道迷宫问题,要求从起点到终点找到一个最短路径。
迷宫是一个 $n \times m$ 的方格矩阵,其中一些方格被墙堵住了,其余方格为道路。每个方格被标记为:
你的任务是从起点 $A$ 走到终点 $B$,你每次可以向上、下、左、右四个方向走过一个道路方块,但不能穿过围墙。你的目标是找到到达终点的最短路径。
如果没有从起点到达终点的路径,则输出 “IMPOSSIBLE”。
输入:
5 8
########
#...#...
#.#.#.#.
#.#...#.
########
输出:
########
#AAA#BBB
#.#.#.#.
#.#...#.
########
这道题可以使用广度优先搜索(BFS)来解决,即以起点 $A$ 为起点,每一层为距离起点 $1, 2, 3, \dots$ 步的所有格子,终点 $B$ 即为所求。
代码如下:
from collections import deque
n, m = map(int, input().split())
maze = []
for _ in range(n):
maze.append(input())
visited = [[False] * m for _ in range(n)]
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
def bfs(x, y):
q = deque([(x, y)])
visited[x][y] = True
while q:
x, y = q.popleft()
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if 0 <= nx < n and 0 <= ny < m and not visited[nx][ny] and maze[nx][ny] == '.':
visited[nx][ny] = True
q.append((nx, ny))
x1, y1, x2, y2 = -1, -1, -1, -1
for i in range(n):
for j in range(m):
if maze[i][j] == 'A':
x1, y1 = i, j
if maze[i][j] == 'B':
x2, y2 = i, j
bfs(x1, y1)
if visited[x2][y2]:
ans = []
for i in range(n):
row = ''
for j in range(m):
if maze[i][j] == '#':
row += '#'
elif visited[i][j]:
row += '.'
else:
row += '#'
ans.append(row)
ans[x1] = ans[x1][:y1] + 'A' + ans[x1][y1 + 1:]
ans[x2] = ans[x2][:y2] + 'B' + ans[x2][y2 + 1:]
print('\n'.join(ans))
else:
print("IMPOSSIBLE")
时间复杂度为 $O(nm)$,空间复杂度为 $O(nm)$。
本题是一道基础的搜索问题,通过 BFS 可以解决。同时在代码实现上,需要注意细节,例如如何输出路径等。