首页 > 试题广场 >

最短路径求和

[编程题]最短路径求和
  • 热度指数:163 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个二维网格,每次只能向下或者向右走,请找出一条从左上角到右下角的最短路径。

示例1

输入

[[2,3,1,4],[4,6,3,1],[4,3,1,2],[2,4,1,3]]

输出

14

说明

路径 2→3→1→3→1→1→3 的总和最小。
    int[][] grid;
    int m, n;
    int res = Integer.MAX_VALUE;

    /**
     * @param grid int整型二维数组
     * @return int整型
     */
    public int minPathSum(int[][] grid) {
        // write code here
        this.grid = grid;
        m = grid.length;
        n = grid[0].length;
        go(0, 0, 0, new int[m][n]);
        return res;
    }

    public void go(int x, int y, int t, int[][] vis) {
        if (x == m - 1 && y == n - 1) {
            res = Math.min(res, t + grid[x][y]);
            return;
        }

        vis[x][y] = 1;
        if (x < m - 1 && vis[x + 1][y] == 0) {
            go(x + 1, y, t + grid[x][y], vis);
        }
        if (y < n - 1 && vis[x][y + 1] == 0) {
            go(x, y + 1, t + grid[x][y], vis);
        }
        if (x > 0 && vis[x - 1][y] == 0) {
            go(x - 1, y, t + grid[x][y], vis);
        }
        if (y > 0 && vis[x][y - 1] == 0) {
            go(x, y - 1, t + grid[x][y], vis);
        }
        vis[x][y] = 0;

    }

发表于 2021-09-13 22:09:38 回复(0)