Leetcode 130. 被圍繞的區域【BFS】

問題描述

給定一個二維的矩陣,包含 'X''O'字母 O)。

找到所有被 'X' 圍繞的區域,並將這些區域裏所有的 'O''X' 填充。

示例:

X X X X
X O O X
X X O X
X O X X

運行你的函數後,矩陣變爲:

X X X X
X X X X
X X X X
X O X X

解釋:

被圍繞的區間不會存在於邊界上,換句話說,任何邊界上的 'O’ 都不會被填充爲 'X'。 任何不在邊界上,或不與邊界上的 'O' 相連的 'O' 最終都會被填充爲 'X'。如果兩個元素在水平或垂直方向相鄰,則稱它們是“相連”的。

解題報告

  • 初始化時將邊界處的 'O' 的放入隊列中,同時將該處的 'O' 換成其他字母,例如 'Q'
  • 之後 BFS 搜索,當搜到符合條件的 'O' 時,壓入隊列中,將其置爲 'Q'
  • BFS 結束後,將矩陣中的 'Q' 置爲 'O',其他置爲 'X'

這題還可以用 並查集 實現,待補充。

實現代碼

class Solution {
public:
    unordered_map<int,int>parent;
    unordered_map<int,int>cnt;
    void solve(vector<vector<char>>& board) {
        if(board.size()==0) return;
        int m=board.size(), n=board[0].size();
        int dx[4]={0,1,0,-1};
        int dy[4]={1,0,-1,0};
        queue<pair<int,int>>q;
        
        for(int i=0;i<m;i++){
            if(board[i][0]=='O'){
                q.push({i,0});
                board[i][0]='Q';
            }
            if(board[i][n-1]=='O'){
                q.push({i,n-1});
                board[i][n-1]='Q';
            }
        }
        for(int j=0;j<n;j++){
            if(board[0][j]=='O'){
                q.push({0,j});
                board[0][j]='Q';
            }
            if(board[m-1][j]=='O'){
                q.push({m-1,j});
                board[m-1][j]='Q';
            }
        }
        // cout<<q.size()<<endl;
        while(!q.empty()){
            pair<int, int>one=q.front();
            q.pop();
            for(int i=0;i<4;i++){
                int x=one.first+dx[i];
                int y=one.second+dy[i];
                if(x>=0&&x<m&&y>=0&&y<n&&board[x][y]=='O'){
                    q.push({x,y});
                    board[x][y]='Q';
                }
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(board[i][j]=='Q') board[i][j]='O';
                else board[i][j]='X';
            }
        }
    }
};

參考資料

[1] Leetcode 130. 被圍繞的區域

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