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

  

01-02 01:25