📌  相关文章
📜  找到到达矩阵末尾所需的最小步骤 | 2套(1)

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

找到到达矩阵末尾所需的最小步骤

题目描述

给定一个为0和1的二维矩阵,每个1表示可以走的路径,每个0表示不能走的障碍物。现在你可以从左上角出发,朝右或朝下走,直到达到右下角。找到到达右下角所需的最小步骤。如果无法到达右下角,则返回-1。

例子
例子1

输入:

grid = [
  [1, 0],
  [1, 1]
]

输出: 2

解释:

1 -> 1 -> 1,到达右下角所需的最小步骤为2。

例子2

输入:

grid = [
  [1, 1, 0],
  [1, 1, 1],
  [0, 1, 1]
]

输出: 1

解释:

1 -> 1 -> 1 -> 1 -> 1,到达右下角所需的最小步骤为4。

解题思路

题目要求最小步骤,我们可以考虑使用BFS来解决。我们从左上角开始,朝右或下走,每到达一个格子,就记录一下步数,并将下一个可能到达的格子加入队列。由于我们是按照步数来遍历的,所以第一次到达终点的时候,一定是最短步数。如果遍历完整个矩阵都没有到达终点,则返回-1,表示无法到达。

代码实现

以下是Python的实现代码片段:

def minSteps(grid):
    rows, cols = len(grid), len(grid[0])
    visited = [[False] * cols for _ in range(rows)]
    queue = [(0, 0, 0)]  # (row, col, steps)
    dirs = [(0, 1), (1, 0)]

    while queue:
        row, col, steps = queue.pop(0)
        if row == rows - 1 and col == cols - 1:
            return steps

        for dir in dirs:
            new_row, new_col = row + dir[0], col + dir[1]
            if 0 <= new_row < rows and 0 <= new_col < cols and grid[new_row][new_col] == 1 and not visited[new_row][new_col]:
                visited[new_row][new_col] = True
                queue.append((new_row, new_col, steps + 1))

    return -1

以上代码在Python中实现了最短步数的BFS解法,时间复杂度为$O(n^2)$,其中$n$为矩阵的长度和宽度。