首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >算法奇妙屋(十六)-BFS解决边权为1的多源最短路径问题

算法奇妙屋(十六)-BFS解决边权为1的多源最短路径问题

作者头像
景画
发布2025-12-19 13:34:05
发布2025-12-19 13:34:05
10
举报
整体算法解析

一. 力扣 542. 01 矩阵

1. 题目解析

2. 算法原理

这里细节与之前的单源问题稍有不同, 但基本上一模一样, 这里直接看图即可

在这里插入图片描述
在这里插入图片描述

3. 代码

代码语言:javascript
复制
    public int[][] updateMatrix(int[][] mat) {
        int[] dx = { 1, -1, 0, 0 };
        int[] dy = { 0, 0, 1, -1 };
        int m = mat.length;
        int n = mat[0].length;
        int[][] dist = new int[m][n];
        Queue<int[]> q = new LinkedList<>();
        // 初始化, 加入队列
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (mat[i][j] == 0) {
                    dist[i][j] = 0;
                    q.offer(new int[] { i, j });
                } else {
                    dist[i][j] = -1;
                }
            }
        }
        // 扩展
        while (!q.isEmpty()) {
            int[] t = q.poll();
            int a = t[0];
            int b = t[1];
            for (int i = 0; i < 4; i++) {
                int x = a + dx[i];
                int y = b + dy[i];
                if (x >= 0 && x < m && y >= 0 && y < n && dist[x][y] == -1) {
                    q.offer(new int[] { x, y });
                    dist[x][y] = dist[a][b] + 1;
                }
            }
        }
        return dist;
    }

二. 力扣 1020. 飞地的数量

1. 题目解析

在这里插入图片描述
在这里插入图片描述

2. 算法原理

这里的算法原理也是十分简单, 正难则反的思想一定要注意, 遇到想不到解法的题不妨换个角度

在这里插入图片描述
在这里插入图片描述

3. 代码

代码语言:javascript
复制
    public int numEnclaves(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int[] dx = {0, 0, 1, -1};
        int[] dy = {1, -1, 0, 0};
        boolean[][] vis = new boolean[m][n];
        Queue<int[]> q = new LinkedList<>();
        // 初始化队列和标记
        for (int i = 0; i < m; i++) {
            if (grid[i][0] == 1) {
                q.offer(new int[]{i, 0});
                vis[i][0] = true;
            }
            if (grid[i][n - 1] == 1) {
                q.offer(new int[]{i, n - 1});
                vis[i][n - 1] = true;
            }
        }
        for (int j = 0; j < n; j++) {
            if (grid[0][j] == 1) {
                q.offer(new int[]{0, j});
                vis[0][j] = true;
            }
            if (grid[m - 1][j] == 1) {
                q.offer(new int[]{m - 1, j});
                vis[m - 1][j] = true;
            }
        }
        while(!q.isEmpty()) {
            int[] t = q.poll();
            int a = t[0];
            int b = t[1];
            for (int i = 0; i < 4; i++) {
                int x = a + dx[i];
                int y = b + dy[i];
                if (x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && grid[x][y] == 1) {
                    q.offer(new int[]{x, y});
                    vis[x][y] = true;
                }
            }
        }
        int ret = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 1 && !vis[i][j]) {
                    ret++;
                }
            }
        }
        return ret;
    }

三. 力扣 1765. 地图中的最高点

1. 题目解析

这道题和之前的题十分类似, 就是题意理解起来有点困难, 但是理解完题意之后这道题的解法就出来了

在这里插入图片描述
在这里插入图片描述

2. 算法原理

因为和矩阵那道题解法一模一样, 所以这里我就直接将上面的题解复制下来, 并解释为何如此

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 代码

代码语言:javascript
复制
    public int[][] highestPeak(int[][] isWater) {
        int[] dx = { 0, 0, 1, -1 };
        int[] dy = { 1, -1, 0, 0 };
        int m = isWater.length;
        int n = isWater[0].length;
        int[][] ret = new int[m][n];
        Queue<int[]> q = new LinkedList<>();
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                ret[i][j] = -1;
            }
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (isWater[i][j] == 1) {
                    q.offer(new int[] { i, j });
                    ret[i][j] = 0;
                }
            }
        }
        while (!q.isEmpty()) {
            int[] t = q.poll();
            int a = t[0];
            int b = t[1];
            for (int i = 0; i < 4; i++) {
                int x = a + dx[i];
                int y = b + dy[i];
                if (x >= 0 && x < m && y >= 0 && y < n && ret[x][y] == -1) {
                    q.offer(new int[] { x, y });
                    ret[x][y] = ret[a][b] + 1;
                }
            }
        }
        return ret;
    }

四. 力扣 1162. 地图分析

1. 题目解析

在这里插入图片描述
在这里插入图片描述

2. 算法原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 代码

代码语言:javascript
复制
    public int maxDistance(int[][] grid) {
        int[] dx = { 0, 0, 1, -1 };
        int[] dy = { 1, -1, 0, 0 };
        int m = grid.length;
        int n = grid[0].length;
        int[][] dist = new int[m][n];
        Queue<int[]> q = new LinkedList<>();
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                dist[i][j] = -1;
            }
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 1) {
                    dist[i][j] = 0;
                    q.offer(new int[]{i, j});
                }
            }
        }
        int ret = -1;
        while(!q.isEmpty()) {
            int[] t = q.poll();
            int a = t[0];
            int b = t[1];
            for (int i = 0; i < 4; i++) {
                int x = a + dx[i];
                int y = b + dy[i];
                if (x >= 0 && x < m && y >= 0 && y < n && dist[x][y] == -1) {
                    q.offer(new int[]{x, y});
                    dist[x][y] = dist[a][b] + 1;
                    ret = Math.max(dist[x][y], ret);
                }
            }
        }
        return ret;
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 整体算法解析
  • 一. 力扣 542. 01 矩阵
    • 1. 题目解析
    • 2. 算法原理
    • 3. 代码
  • 二. 力扣 1020. 飞地的数量
    • 1. 题目解析
    • 2. 算法原理
    • 3. 代码
  • 三. 力扣 1765. 地图中的最高点
    • 1. 题目解析
    • 2. 算法原理
    • 3. 代码
  • 四. 力扣 1162. 地图分析
    • 1. 题目解析
    • 2. 算法原理
    • 3. 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档