- 题目描述
在给定的二维二进制数组 A 中,存在两座岛。(岛是由四面相连的 1 形成的一个最大
组。)
现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛。
返回必须翻转的 0 的最小数目。(可以保证答案至少是 1。)
- 题解
等同于求两个岛屿之间的最近距离,使用广度优先搜索。
- 代码
class Solution {
public:
void dfs(vector<vector<int>>& A,int x,int y,int m,int n){
if (x<0||x>=m||y<0||y>=n) return;
que.push({x,y});
for (int k=0;k<4;k++){
int xx=x+d[k][0];
int yy=y+d[k][1];
if (xx<0||xx>=m||yy<0||yy>=n||A[xx][yy]!=1) continue;
A[xx][yy]=2;
dfs(A,xx,yy,m,n);
}
}
int bfs(vector<vector<int>>& A,int m,int n){
int res=0;
while (!que.empty()){
int cnt=que.size();
for (int i=0;i<cnt;i++){
int x=que.front().first;
int y=que.front().second;
que.pop();
for (int k=0;k<4;k++){
int xx=x+d[k][0];
int yy=y+d[k][1];
if (xx<0||xx>=m||yy<0||yy>=n||A[xx][yy]==2) continue;
if (A[xx][yy]==1) return res;
A[xx][yy]=2;
que.push({xx,yy});
}
}
res++;
}
return res;
}
int shortestBridge(vector<vector<int>>& A) {
int m=A.size();
if (!m) return 0;
int n=A[0].size();
if (!n) return 0;
bool flag=false;
for (int i=0;i<m;i++){
for (int j=0;j<n;j++){
if (A[i][j]){
flag=true;
A[i][j]=2;
dfs(A,i,j,m,n);
break;
}
}
if (flag) break;
}
return bfs(A,m,n);
}
int d[4][2]={0,1,1,0,0,-1,-1,0};
queue<pair<int,int>> que;
};