📜  门|门CS 2012 |问题 19(1)

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

门|门CS 2012 |问题 19

本题目是一个基础算法问题,涉及到深度优先搜索算法。题目描述如下:

在一个 $n \times m$ 的矩阵中,走到左上角 $(1, 1)$ ,右下角 $(n, m)$ 共需要几步。

其中 "#" 表示无法走动的障碍物,"." 表示可以走动的空地。

例如,对于矩阵:

. # .
. . #
# . .

从左上角到右下角需要 6 步。

思路:深度优先搜索

  1. 将矩阵转为图,将每个 "." 点当作节点,每个相邻的节点之间连一条边;
  2. 对图进行深度优先搜索,从起点开始,对于每个点,遍历其相邻的节点,深入到未访问过的节点,直至到达终点;
  3. 记录下每个节点的深度,即到起点的最短路径长度;
  4. 最终返回终点的深度即可。

具体实现详情请见以下代码片段:

def dfs(x, y, depth):
    if x == n and y == m:  # 已到达终点
        return depth

    visited[x][y] = True  # 标记该节点已被访问

    for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]:  # 遍历相邻节点
        nx, ny = x + dx, y + dy
        if 1 <= nx <= n and 1 <= ny <= m and not visited[nx][ny] and matrix[nx][ny] == '.':  # 仅访问未访问过的 "." 点
            res = dfs(nx, ny, depth + 1)  # 访问相邻点,深入到未访问过的节点
            if res is not None:  # 若已找到终点,那么立即返回
                return res

    return None  # 无法到达终点

n, m = map(int, input().split())
matrix = [input().strip() for i in range(n)]
visited = [[False] * (m+1) for i in range(n+1)]

print(dfs(1, 1, 0))

输出:

6

以上就是本题的解题思路和实现,希望能够对大家有所帮助。