答案:
class Solution {
public int shortestBridge(int[][] grid) {
Queue<int[]> queue = new ArrayDeque<int[]>();
List<int[]> island = new ArrayList<int[]>();
for(int i=0;i<grid.length;i++){
boolean f = true;
for(int j=0;j<grid.length;j++){
if(grid[i][j]==1){
queue.offer(new int[]{i,j});
grid[i][j] = -1;
f = false;
break;
}
}
if(f==false)break;
}
while(!queue.isEmpty()){
int[] cell = queue.poll();
int x = cell[0];
int y = cell[1];
island.add(cell);
if(x+1<grid.length&&grid[x+1][y]==1){
queue.offer(new int[]{x+1,y});
grid[x+1][y] = -1;
}
if(y+1<grid[0].length&&grid[x][y+1]==1){
queue.offer(new int[]{x,y+1});
grid[x][y+1] = -1;
}
if(x>0&&grid[x-1][y]==1){
queue.offer(new int[]{x-1,y});
grid[x-1][y] = -1;
}
if(y>0&&grid[x][y-1]==1){
queue.offer(new int[]{x,y-1});
grid[x][y-1] = -1;
}
}
for(int[] cell:island){
queue.offer(cell);
}
int step = 0;
while(!queue.isEmpty()){
int len = queue.size();
for(int i=0;i<len;i++){
int[] cell = queue.poll();
int x = cell[0];
int y = cell[1];
island.add(cell);
if(x+1<grid.length&&grid[x+1][y]==1){
return step;
}
if(y+1<grid[0].length&&grid[x][y+1]==1){
return step;
}
if(x>0&&grid[x-1][y]==1){
return step;
}
if(y>0&&grid[x][y-1]==1){
return step;
}
if(x+1<grid.length&&grid[x+1][y]==0){
queue.offer(new int[]{x+1,y});
grid[x+1][y] = -1;
}
if(y+1<grid[0].length&&grid[x][y+1]==0){
queue.offer(new int[]{x,y+1});
grid[x][y+1] = -1;
}
if(x>0&&grid[x-1][y]==0){
queue.offer(new int[]{x-1,y});
grid[x-1][y] = -1;
}
if(y>0&&grid[x][y-1]==0){
queue.offer(new int[]{x,y-1});
grid[x][y-1] = -1;
}
}
step++;
}
return step;
}
}