首页 > 其他 > 详细

BFS——1091. 二进制矩阵中的最短路径

时间:2020-07-19 17:51:05      阅读:66      评论:0      收藏:0      [点我收藏+]

在一个 N × N 的方形网格中,每个单元格有两种状态:空(0)或者阻塞(1)。

一条从左上角到右下角、长度为 k 的畅通路径,由满足下述条件的单元格 C_1, C_2, ..., C_k 组成:

相邻单元格 C_i 和 C_{i+1} 在八个方向之一上连通(此时,C_i 和 C_{i+1} 不同且共享边或角)
C_1 位于 (0, 0)(即,值为 grid[0][0])
C_k 位于 (N-1, N-1)(即,值为 grid[N-1][N-1])
如果 C_i 位于 (r, c),则 grid[r][c] 为空(即,grid[r][c] == 0)
返回这条从左上角到右下角的最短畅通路径的长度。如果不存在这样的路径,返回 -1 。

技术分享图片

 

 

 技术分享图片

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shortest-path-in-binary-matrix


 

思路:

找最短路径问题,首先想到的就是BFS,如果是DFS,BFS一层一层往下遍历,找到了就知道下面的是更深层次的,肯定比当前层次的要长

其次,看到底是八连通还是四连通,就是说斜边能不能走,能走就是八连通,这题就是八连通,还要注意返回值是经过了多少个格子

class Solution {
    public int shortestPathBinaryMatrix(int[][] grid) {
        //八连通的问题
        int[][] DIR = {
                {1,0},
                {-1,0},
                {0,1},
                {0,-1},
                {1,1},
                {1,-1},
                {-1,1},
                {-1,-1}
        };
        //定义两个变量来存储长和宽
        int R = grid.length;
        int C = grid[0].length;
        //排除一些特殊情况
        if (grid[0][0] == 1){
            return -1;
        }
        if (R == 1 && C == 1){
            return 1;
        }
        //准备工作
        boolean[][]vis = new boolean[R][C];
        int[][]path = new int[R][C];
        Queue<Integer> queue = new LinkedList<>();
        queue.add(0);
        vis[0][0]=true;
        path[0][0]=1;
        int r,c;
        while (!queue.isEmpty()){
            Integer pos = queue.poll();
            //一维数组转换为二维数组的行和列
            r = pos/C; //
            c = pos%C; //

            for (int d = 0; d < DIR.length; ++d) {
                int nr = r + DIR[d][0];
                int nc = c + DIR[d][1];
                if(inArea(nr,nc,grid) && !vis[nr][nc] && grid[nr][nc]!=1)
                {
                    //记录步长
                    path[nr][nc] = path[r][c]+1;
                    //状态改变
                    vis[nr][nc]=true;
                    //此处再转换为一维数组
                    queue.add(nc+nr*C);
                    //状态压缩 --->  (x,y) 转移为 格子序号
                    if(nr==R-1 && nc == C-1)
                    {
                        //说明到达终点
                        return path[nr][nc];
                    }


                }
            }
        }
        return -1;
    }
    public boolean inArea(int r,int c,int[][] grid)
    {
        return r>=0&& r<grid.length && c>=0&& c<grid[0].length;
    }
}

 

BFS——1091. 二进制矩阵中的最短路径

原文:https://www.cnblogs.com/zzxisgod/p/13340270.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!