1. 程式人生 > >leetcode 130. Surrounded Regions 被圍繞的區域 c++

leetcode 130. Surrounded Regions 被圍繞的區域 c++

給定一個二維的矩陣,包含 '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’有聯絡的區域都不會填充,其他都會被填充

第一步:

將所有邊界上的‘O’轉化為‘1’(1.區別兩種‘O’   2.避免重複遍歷)

對每個元素呼叫check()函式

check函式的實現:

判斷元素是否為‘O’,如果是,將其轉化為‘1’,並且遍歷它的上下左右

第二步:

將所有‘O’元素(未被轉化為‘1’的)轉化為‘X’

第三步:

將所有‘1’元素轉化為‘O’

程式碼:

class Solution {
public:
    void solve(vector<vector<char>>& board) {
        if(board.empty()||board.size() == 0 || board[0].size() == 0)
            return;
        int row=board.size(),column=board[0].size();
         for (int i = 0; i < row; ++i) {
            check(board, i, 0);             // first column
            check(board, i, column - 1);       // last column
        }
        for (int j = 1; j < column - 1; ++j) {
            check(board, 0, j);             // first row
            check(board, row - 1, j);       // last row
        }
        for (int i = 0; i < row; ++i)
            for (int j = 0; j < column; ++j)
                if (board[i][j] == 'O') board[i][j] = 'X';
                else if (board[i][j] == '1') board[i][j] = 'O';
    
      
    }
    void check(vector<vector<char>>& board,int x,int y)
    {
        if(board[x][y]=='O'){
                board[x][y]='1';
        if(x>1) check(board,x-1,y);
        if(y>1) check(board,x,y-1);
        if(x<board.size()-1) check(board,x+1,y);
        if(y<board[0].size()-1) check(board,x,y+1);
        }
        
    }
};