算法题目---多源BFS

(一).概念

关于"多源BFS"问题,通过一张图来给大家介绍

(二).具体题目

1.01矩形

542. 01 矩阵 - 力扣(LeetCode)

解法:多源BFS+正难则反

java 复制代码
class Solution {
    public int[][] updateMatrix(int[][] mat) {
        int lenR=mat.length;
        int lenC=mat[0].length;
        int[][] ans=new int[lenR][lenC];
        Queue<int[]> queue=new ArrayDeque<>();
        for (int i = 0; i < lenR; i++) {
            for (int j = 0; j < lenC; j++) {
                ans[i][j]=-1;
                if (mat[i][j]==0){
                    queue.add(new int[]{i,j});
                    ans[i][j]=0;
                }
            }
        }
        int[] dx={1,-1,0,0};
        int[] dy={0,0,1,-1};
        while (!queue.isEmpty()){
            int[] poll = queue.poll();
            int posx=poll[0];
            int posy=poll[1];
            for (int i = 0; i < 4; i++) {
                int newx=posx+dx[i];
                int newy=posy+dy[i];
                if (newx>=0 && newx<lenR && newy>=0 && newy<lenC && ans[newx][newy]==-1){
                    queue.add(new int[]{newx,newy});
                    ans[newx][newy]=ans[posx][posy]+1;
                }
            }
        }
        return ans;
    }
}

2.飞地的数量

1020. 飞地的数量 - 力扣(LeetCode)

解法:多源BFS+正难则反

java 复制代码
class Solution {
    public int numEnclaves(int[][] grid) {
        int lenR=grid.length;
        int lenC=grid[0].length;
        int ret=0;
        Queue<int[]> queue=new ArrayDeque<>();
        int[][] visit=new int[lenR][lenC];
        for (int i = 0; i < lenR; i++) {
            if (grid[i][0]==1){      //检查第0列
                queue.add(new int[]{i,0});
            }
            if (grid[i][lenC-1]==1){   //检查最后一列
                queue.add(new int[]{i,lenC-1});
            }
        }
        for (int i = 0; i < lenC; i++) {
            if (grid[0][i]==1){   //检查第一行
                queue.add(new int[]{0,i});
            }
            if (grid[lenR-1][i]==1){  //检查最后一行
                queue.add(new int[]{lenR-1,i});
            }
        }
        int[] dx={0,0,1,-1};
        int[] dy={1,-1,0,0};
        while (!queue.isEmpty()){
            int[] poll = queue.poll();
            int posX=poll[0];
            int posY=poll[1];
            visit[posX][posY]=1;
            for (int j = 0; j < 4; j++) {
                int newX=posX+dx[j];
                int newY=posY+dy[j];
                if (newX>=0 && newX<lenR && newY>=0 && newY<lenC && grid[newX][newY]==1 && visit[newX][newY]==0){
                    queue.add(new int[]{newX,newY});
                    visit[newX][newY]=1;
                }
            }
        }
        for (int i = 0; i < lenR; i++) {
            for (int j = 0; j < lenC; j++) {
                if (grid[i][j]==1 && visit[i][j]==0){
                    ret++;
                }
            }
        }
        return ret;
    }
}

3.地图中的最高点

1765. 地图中的最高点 - 力扣(LeetCode)

解法:多源BFS

java 复制代码
class Solution {
    public int[][] highestPeak(int[][] isWater){
        int lenR=isWater.length;
        int lenC=isWater[0].length;
        int[][] ans=new int[lenR][lenC];
        for (int i = 0; i < lenR; i++) {
            for (int j = 0; j < lenC; j++) {
                ans[i][j]=-1;   //全部初始化为-1
            }
        }
        Queue<int[]> queue=new ArrayDeque<>();
        for (int i = 0; i < lenR; i++) {
            for (int j = 0; j < lenC; j++) {
                if (isWater[i][j]==1){
                    ans[i][j]=0;
                    queue.add(new int[]{i,j});
                }
            }
        }
        int[] dx={1,-1,0,0};
        int[] dy={0,0,1,-1};
        while (!queue.isEmpty()){
            int[] poll = queue.poll();
            int posX=poll[0];
            int posY=poll[1];
            for (int i = 0; i < 4; i++) {
                int newX=posX+dx[i];
                int newY=posY+dy[i];
                if (newX>=0 && newY>=0 && newX<lenR && newY<lenC && ans[newX][newY]==-1){
                    ans[newX][newY]=ans[posX][posY]+1;
                    queue.add(new int[]{newX,newY});
                }
            }
        }
        return ans;
    }
}

4.地图分析

1162. 地图分析 - 力扣(LeetCode)

解法:多源BFS+正难则反

java 复制代码
class Solution {
    public int maxDistance(int[][] grid) {
        int lenR=grid.length;
        int[][] visit=new int[lenR][lenR];
        for (int i = 0; i < lenR; i++) {
            for (int j = 0; j < lenR; j++) {
                visit[i][j]=-1;
            }
        }
        Queue<int[]> queue=new ArrayDeque<>();
        for (int i = 0; i < lenR; i++) {
            for (int j = 0; j < lenR; j++) {
                if (grid[i][j]==1){
                    queue.add(new int[]{i,j});
                    visit[i][j]=0;
                }
            }
        }
        int[] dx={0,0,1,-1};
        int[] dy={1,-1,0,0};
        int ret=-1;

        while (!queue.isEmpty()){
            int[] poll = queue.poll();
            int posX=poll[0];
            int posY=poll[1];
            for (int i = 0; i < 4; i++) {
                int newX=posX+dx[i];
                int newY=posY+dy[i];
                if (newX>=0 && newX<lenR && newY>=0 && newY<lenR && visit[newX][newY]==-1){
                    visit[newX][newY]=visit[posX][posY]+1;
                    queue.add(new int[]{newX,newY});
                    ret=Math.max(ret,visit[newX][newY]);
                }
            }
        }
        return ret;
    }
}