李静做的化妆品网站,烟台微信网站建设,南昌网站推广排名,大型建设工程类考试辅导网站在给定的二维二进制数组 A 中#xff0c;存在两座岛。#xff08;岛是由四面相连的 1 形成的一个最大组。#xff09;
现在#xff0c;我们可以将 0 变为 1#xff0c;以使两座岛连接起来#xff0c;变成一座岛。
返回必须翻转的 0 的最小数目。#xff08;可以保证答…在给定的二维二进制数组 A 中存在两座岛。岛是由四面相连的 1 形成的一个最大组。
现在我们可以将 0 变为 1以使两座岛连接起来变成一座岛。
返回必须翻转的 0 的最小数目。可以保证答案至少是 1。
示例 1
输入[[0,1],[1,0]] 输出1
代码
class Solution {public void helper(int[][] A,int[][] dir) {//dfs找出第一座岛标为2for(int i0;iA.length;i)for(int j0;jA[0].length;j)if(A[i][j]1){dfs(A,dir,i,j);return;}}Queueint[] queuenew LinkedList();public int shortestBridge(int[][] A) {int[][] dirnew int[][]{{-1,0},{1,0},{0,1},{0,-1}};int nA.length,mA[0].length;helper(A,dir);while (!queue.isEmpty())//bfs{int[] equeue.poll();int exe[0],eye[1],ele[2];for(int[] d:dir)//向4个方向蔓延{int nextXexd[0],nextYeyd[1];if(nextX0||nextXA.length||nextY0||nextYA[0].length||A[nextX][nextY]2)continue;//不能走的点if(A[nextX][nextY]1) return el;queue.offer(new int[]{nextX,nextY,el1});A[nextX][nextY]2;//标记为第一座岛屿避免重复访问}}return -1;}public void dfs(int[][] A,int[][] dir,int x,int y) {A[x][y]2;queue.offer(new int[]{x,y,0});for(int[] d:dir){int nextXxd[0],nextYyd[1];if(nextX0||nextXA.length||nextY0||nextYA[0].length||A[nextX][nextY]!1)continue;dfs(A, dir, nextX, nextY);}}
}