leetcode:Surrounded Regions

Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'.

A region is captured by flipping all 'O's into 'X's in that surrounded region.

For example,

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

After running your function, the board should be:

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

題目意思:找出所有被X包圍的O組成的區域,並把這些區域全部替換成X;

解題思路:

1,先從最外圍開始遍歷,將最外圍的O暫時替換成P;然後深搜把與P相鄰的O也替換成P...

2,將O替換成X,P恢復成O

AC代碼:

class Solution {
public:
    void solve(vector<vector<char>> &board) {
        //如果行或列小於等於2則不包含被包圍的O直接返回
        int m = board.size();
        if(m <= 2) return;
        int n = board[0].size();
        if(n <= 2) return;
        
        //先遍歷最上面的那一行
        for(int i = 0;i < n;i++){
            if(board[0][i] == 'O'){
                //標記爲#
                board[0][i] = 'P';
                dfs(board,0,i,m,n);
            }
        }
        
        //遍歷最下面那一行
        for(int i = 0;i < n;i++){
            if(board[m - 1][i] == 'O'){
                //標記爲#
                board[m - 1][i] = 'P';
                dfs(board,m - 1,i,m,n);
            }
        }
        
        //遍歷最左邊那一行
        for(int i = 0;i < m;i++){
            if(board[i][0] == 'O'){
                //標記爲#
                board[i][0] = 'P';
                dfs(board,i,0,m,n);
            }
        }
        
        //遍歷最右邊那一行
        for(int i = 0;i < m;i++){
            if(board[i][n - 1] == 'O'){
                //標記爲#
                board[i][n - 1] = 'P';
                dfs(board,i,n - 1,m,n);
            }
        }
        
        //最後遍歷一遍,把O替換成X,把P替換成O
        for(int i = 0;i < m;i++){
            for(int j = 0;j < n;j++){
                if(board[i][j] == 'O') board[i][j] = 'X';
                else if(board[i][j] == 'P') board[i][j] = 'O';
            }
        }
        
    }
private:
    void dfs(vector<vector<char>> &board,int i,int j,int m,int n){
        //如果該點的上面的點未到圖的邊緣且爲O繼續遍歷
        if(i > 1 && board[i - 1][j] == 'O'){
            board[i - 1][j] = 'P';
            dfs(board,i - 1,j,m,n);
        }
        
        //如果該點的下面的點未到圖的邊緣且爲O繼續遍歷
        if(i < m - 1 && board[i + 1][j] == 'O'){
            board[i + 1][j] = 'P';
            dfs(board,i + 1,j,m,n);
        }
        
        //如果該點的左邊的點未到圖的邊緣且爲O繼續遍歷
        if(j > 1 && board[i][j - 1] == 'O'){
            board[i][j - 1] = 'P';
            dfs(board,i,j - 1,m,n);
        }
        
        //如果該點的左邊的點未到圖的邊緣且爲O繼續遍歷
        if(j < n - 1 && board[i][j + 1] == 'O'){
            board[i][j + 1] = 'P';
            dfs(board,i,j + 1,m,n);
        }
    }
};
//解題思路:
//1,先遍歷一遍外圍的點,如果是O替換爲P
//2,遇到O之後深度遍歷O周圍的O也替換爲P
//3,最後一步,將P換回O,將O替換成X



發佈了47 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章