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

文章目录

整体算法解析

一. 力扣 542. 01 矩阵

1. 题目解析

2. 算法原理

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

3. 代码

java 复制代码
    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. 代码

java 复制代码
    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. 代码

java 复制代码
    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. 代码

java 复制代码
    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;
    }
相关推荐
超级码力6667 小时前
【Latex文件架构】Latex文件架构模板
算法·数学建模·信息可视化
穿条秋裤到处跑7 小时前
每日一道leetcode(2026.04.29):二维网格图中探测环
算法·leetcode·职场和发展
Merlos_wind8 小时前
HashMap详解
算法·哈希算法·散列表
汉克老师8 小时前
GESP2025年3月认证C++五级( 第三部分编程题(1、平均分配))
c++·算法·贪心算法·排序·gesp5级·gesp五级
Yzzz-F11 小时前
Problem - 2205D - Codeforces
算法
智者知已应修善业11 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
Halo_tjn11 小时前
Java Set集合相关知识点
java·开发语言·算法
生成论实验室12 小时前
《事件关系阴阳博弈动力学:识势应势之道》第四篇:降U动力学——认知确定度的自驱演化
人工智能·科技·神经网络·算法·架构
AI科技星12 小时前
全域数学·72分册:场计算机卷【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
科研前沿13 小时前
镜像孪生VS视频孪生核心技术产品核心优势
大数据·人工智能·算法·重构·空间计算