📜  迷宫 cses (1)

📅  最后修改于: 2023-12-03 15:28:20.552000             🧑  作者: Mango

迷宫 CSES

简介

迷宫 CSES 是 CSES 题库中的一道迷宫问题,要求从起点到终点找到一个最短路径。

题目描述

迷宫是一个 $n \times m$ 的方格矩阵,其中一些方格被墙堵住了,其余方格为道路。每个方格被标记为:

  • $.$ 表示道路
  • $#$ 表示围墙
  • $A$ 表示起点
  • $B$ 表示终点

你的任务是从起点 $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 可以解决。同时在代码实现上,需要注意细节,例如如何输出路径等。