暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据结构和算法【89】最短通路值

皮皮克克 2023-12-03
62

点击关注公众号,干货第一时间送达


这题还是 "矩阵" 类型题目,

看起来像是 "图" 的,

其实,有点差别,

因为这题没有多路连通。

一起来看看。


一、屏幕前的吴彦祖和刘亦菲们,请听题

举个例子:

如上图,就是求这样一条路径值。

诸位应该遇到过类似的题目,

不难,

利用广度遍历即可。


二、解题

这里呢,我们可以创建记录矩阵 map[][],

用于记录从出发点(0,0)

到达当前点(x,y)的最短路径值 map[x][y],

初始的时候,map[0][0] = 1

利用队列,广度遍历原矩阵 matrix[][] 的元素,

并且需要判断当前点(x,y)的上、下、左、右 四个相邻点,

是否可以走:

在代码中,可以通过方法调用实现:

当前,也可以写成 for 循环的形式,

都可以,原理是一样的。


最后,到达矩阵右下角,

也就是 matrix[M-1][N-1],

返回记录值 map[M-1][N-1] 即可:

看看代码。



完整代码:

public class CodingDemo_03 {

    /**
     * 最短通路值
     * @param matrix
     * @return
     */

    private static int minPathValue(int[][] matrix){
        if (matrix == null || matrix.length == 0 || matrix[0] == null || matrix[0].length == 0
        || matrix[matrix.length-1][matrix[0].length-1] != 1){
            return 0;
        }

        int M = matrix.length;
        int N = matrix[0].length;

        //1,创建记录数组,记录到达每个位置最短路径值
        int[][] map = new int[M][N];
        map[0][0] = 1;

        //2,创建队列,用于广度遍历
        //队列值 int[],分别表示矩阵中元素(x,y)的坐标值
        Deque<int[]> queue = new LinkedList<>();
        queue.offerLast(new int[]{0,0});

        //3,开始广度遍历
        while (!queue.isEmpty()){

            //4,当前位置(x,y),初始的时候,从原点(0,0)出发,map记录已经存在
            int[] cell = queue.pollFirst();
            int x = cell[0];
            int y = cell[1];

            //到达终点
            if (x == M-1 && y == N-1){
                return map[x][y];
            }

            //记录到达当前点的路径值
            int pre = map[x][y];

            //5,遍历当前点,上、下、左、右 四个相邻格子的点
            bfs(matrix, map, queue, pre, x-1, y);
            bfs(matrix, map, queue, pre, x, y+1);
            bfs(matrix, map, queue, pre, x+1, y);
            bfs(matrix, map, queue, pre, x, y-1);
        }
        return 0;
    }

    private static void bfs(int[][] matrix, int[][] map, Deque<int[]> queue, int pre, int x, int y){
        //剔除越界的点,matrix[x][y] != 1 无效点,和 map[x][y] != 0 已经走过的点
        if (x < 0 || x >= matrix.length || y < 0 || y >= matrix[0].length ||
        matrix[x][y] != 1 || map[x][y] != 0){
            return;
        }

        //设置当前点的路径值
        map[x][y] = pre+1;
        //加入队列,用于bfs遍历
        queue.offerLast(new int[]{x,y});
    }

    public static void main(String[] args) {
        int[][] matrix = {
                {1,0,1,1,1},
                {1,0,1,0,1},
                {1,1,1,0,1},
                {0,0,0,0,1},
        };
        System.out.println(minPathValue(matrix));
    }
}

输出:

D:\java\bin\java.exe
12



结束语:
Ok,就是本篇文章的全部内容了。
如果各位有不懂的地方,欢迎发消息给小编,小编会进行详细地解答。
最后,请屏幕前的各位吴彦祖和刘亦菲们,动动你们的小手,给小编一个

文章转载自皮皮克克,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论