在給定的二維二進制數組 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
思路:一次暴力枚舉+兩次BFS
首先暴力枚舉找到隨意1個起點
然後BFS找到和他相鄰的所有1
最後BFS找到另外一堆1
#define NUM(x,y) ((x<0||x>=A.size()||y<0||y>=A.size())? -1:A[x][y])
int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
class Solution {
public:
int shortestBridge(vector<vector<int>>& A) {
int si,sj,len[10000],flag=0;
queue<int>q1,q2;
memset(len,-1,sizeof(len));
for(si=0;si<A.size();si++)for(sj=0;sj<A.size();sj++)if(A[si][sj])goto g1;
g1:
q1.push(si*100+sj);
len[si*100+sj]=0;
while(!q1.empty())
{
int k=q1.front();
q1.pop();
q2.push(k);
int kx=k/100,ky=k%100;
for(int dire=0;dire<4;dire++)
{
int kxx=kx+dx[dire],kyy=ky+dy[dire];
if(NUM(kxx,kyy)==-1||NUM(kxx,kyy)==flag)continue;
if(len[kxx*100+kyy]!=-1)continue;
q1.push(kxx*100+kyy);
len[kxx*100+kyy]=flag?len[k]+1:0;
if(flag && NUM(kxx,kyy)==1)return len[k];
}
}
q1=q2,flag=2;
goto g1;
}
};