题目描述
在给定的二维二进制数组 A 中,存在两座岛。(岛是由四面相连的 1 形成的一个最大组。)
现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛。
返回必须翻转的 0 的最小数目。(可以保证答案至少是 1。)
示例 1:
输入:[[0,1],[1,0]]
输出:1
示例 2:
输入:[[0,1,0],[0,0,0],[0,0,1]]
输出:2
示例 3:
输入:[[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
提示:
1 <= A.length = A[0].length <= 100
A[i][j] == 0 或 A[i][j] == 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shortest-bridge
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
class Solution {
public:
int row,col;
void bfs(vector<vector<int>>& A,vector<pair<int,int>>& g,int x0,int y0,int dx[],int dy[]){
A[x0][y0] = 0;
g.push_back(make_pair(x0,y0));
queue<pair<int,int>> que;
que.push(make_pair(x0,y0));
while(!que.empty()){
int n = que.size();
for(int i=0;i<n;i++){
int x = que.front().first;
int y = que.front().second;
que.pop();
for(int j=0;j<4;j++){
int tx = x+dx[j];
int ty = y+dy[j];
if(tx>=0&&tx<row&&ty>=0&&ty<col&&A[tx][ty]==1){
A[tx][ty] = 0;
que.push(make_pair(tx,ty));
g.push_back(make_pair(tx,ty));
}
}
}
}
}
int shortestBridge(vector<vector<int>>& A) {
int ans = INT_MAX;
row = A.size();
col = A[0].size();
vector<pair<int,int>> g1,g2;
int dx[] = {-1,0,1,0},dy[] = {0,-1,0,1};
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(A[i][j] == 0) continue;
if(g1.size() == 0) bfs(A,g1,i,j,dx,dy);
else bfs(A,g2,i,j,dx,dy);
}
}
for(auto it1 : g1){
for(auto it2 : g2){
ans = min(ans,abs(it1.first-it2.first)+abs(it1.second-it2.second)-1);
}
}
return ans;
}
};