在给定的二维二进制数组 A 中,存在两座岛。(岛是由四面相连的 1 形成的一个最大组。) 现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛。 返回必须翻转的 0 的最小数目。(可以保证答案至少是 1 。)
示例 1:
输入:A = [[0,1],[1,0]]
输出:1
示例 2:
输入:A = [[0,1,0],[0,0,0],[0,0,1]]
输出:2
示例 3:
输入:A = [[1,1,1,1,1],[1,0,0,0,1],[1,0,1,0,1],[1,0,0,0,1],[1,1,1,1,1]]
输出:1
分析:
目前用的解法是先dfs找一座岛屿,然后记录下岛屿所有的点横纵坐标。再搜索第二岛屿,与记录下的坐标做一个最短距离计算,记录最下距离。
图示:
这里给出例三的图示:
代码:
class Solution {
//记录第一岛屿点坐标
int op[] = new int[10000];
int ed[] = new int[10000];
//min是最小距离
int opp=0;int edd = 0;int min=999999;
public int shortestBridge(int[][] grid) {
int flag =0;
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[0].length;j++){
if(grid[i][j]==1){
//dfs标记第一岛屿所有坐标
dfs(grid,i,j);
//拔旗退出
flag=1;
break;
}
}
if(flag ==1) break;
}
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[0].length;j++){
if(grid[i][j]==1){
//第二岛屿开始循坏求最短距离
for(int k=0;k<edd;k++){
int mid;
mid = Math.abs(i-op[k])+Math.abs(j-ed[k])-1;
min = min<mid?min:mid;
}
}
}
}
return min;
}
//不标准的dfs搜索
public void dfs(int[][] grid , int i ,int j){
if(i<0 || i>=grid.length) return ;
if(j<0 ||j>=grid[0].length) return ;
if(grid[i][j] == 2 || grid[i][j] == 0) return ;
if(grid[i][j] == 1 ){
grid[i][j] = 2;
op[opp++] = i;
ed[edd++] = j;
}
dfs(grid, i-1,j);
dfs(grid,i,j-1);
dfs(grid,i+1,j);
dfs(grid,i,j+1);
}
}