leetcode 130. Surrounded Regions 被圍繞的區域 c++
阿新 • • 發佈:2019-02-16
給定一個二維的矩陣,包含 '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); } } };