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; } }