DFS+BFS的实例以及BFS过程的探究
LC 934 https://leetcode-cn.com/problems/shortest-bridge/submissions/
题目:一张地图上有两座小岛,求出这两座小岛之间的最短距离。
class Solution {
public void find(int[][] A,int i,int j){
if(i > A.length || j > A[0].length)
return;
A[i][j] = 2;
if(i - 1 >= 0 && A[i-1][j] == 1){
find(A,i - 1,j);
}
if(i + 1 < A.length && A[i+1][j] == 1)
find(A,i+1,j);
if(j - 1 >= 0 && A[i][j-1] == 1)
find(A,i,j-1);
if(j + 1 < A[0].length && A[i][j+1] == 1)
find(A,i,j+1);
}
Queue<int[]>queue = new LinkedList<>();
public int shortestBridge(int[][] A) {
// 找到第一个岛屿
boolean found = false;
for(int i = 0;i < A.length;i++){
for(int j = 0;j < A[0].length;j++){
if(A[i][j] == 1 && !found){
find(A,i,j);
found = true;
}
// 在寻找第一岛屿的过程中已经将第一个岛屿标记为2
// 所以在需要将另一个岛屿的坐标塞入到一个队列中,并进行层序遍历。
// 有一个问题在于如何找出距离,再本题中就是每当一层遍历完成之后则会将距离+1
if(found && A[i][j] == 1)
queue.offer(new int[]{i,j});
}
}
int m = A.length,n = A[0].length;
boolean[][] visited = new boolean[m][n];
int[][] dirs = new int[][]{{-1,0},{1,0},{0,-1},{0,1}};
int step = 0;
while(!queue.isEmpty()){
int size = queue.size();
while((size--) > 0){
int[] cur = queue.poll();
for(int[] dir : dirs){
int i = cur[0] + dir[0];
int j = cur[1] + dir[1];
if(i < 0 || i >= m || j < 0 || j >= n)
continue;
else if(A[i][j] == 2) return step;
else if(A[i][j] == 1) continue;
else if(A[i][j] == 0){
A[i][j] = 1;
queue.offer(new int[]{i,j});
}
}
}
step++;
}
return 1;
}
}
浙公网安备 33010602011771号