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

(二).具体题目
1.01矩形

解法:多源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.飞地的数量

解法:多源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.地图中的最高点

解法:多源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.地图分析

解法:多源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;
}
}