力扣OJ 934. 最短的橋

在給定的二維二進制數組 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;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章