问题描述

在LeetCode上,编号为514的问题是“自由之路”。这个问题要求我们找出在一个矩阵中从左上角到右下角的最短路径长度,只能向下或向右移动。

解法一

解题思路:

这个问题可以通过动态规划来解决。我们可以使用一个二维数组dp来存储到达每个点的最短路径长度。dp[i][j]表示到达点(i, j)的最短路径长度。状态转移方程为: dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + 1 其中dp[0][0]初始化为grid[0][0],因为起点的路径长度就是起点的值。

/*
 * @lc app=leetcode.cn id=514 lang=javascript
 *
 * [514] 自由之路
 */

// @lc code=start
function shortestPathBinaryMatrix(grid) {
    const m = grid.length, n = grid[0].length;
    if (grid[0][0] === 1 || grid[m-1][n-1] === 0) return 0;
    const dp = Array.from({length: m}, () => Array(n).fill(0));
    dp[0][0] = 1;
    const dirs = [[0, 1], [1, 0]];
    const queue = [[0, 0]];
    while (queue.length) {
        const [i, j] = queue.shift();
        for (let [di, dj] of dirs) {
            const ni = i + di, nj = j + dj;
            if (ni >= 0 && ni < m && nj >= 0 && nj < n && grid[ni][nj] === 1 && !dp[ni][nj]) {
                dp[ni][nj] = dp[i][j] + 1;
                queue.push([ni, nj]);
                grid[ni][nj] = 0;
            }
        }
    }
    return dp[m-1][n-1] ? dp[m-1][n-1] : 0;
}
// @lc code=end