# 【LeetCode】 130. Surrounded Regions ## Description > Given a 2D board containing `'X'` and `'O'` (the letter O), capture all regions surrounded by `'X'`. > A region is captured by flipping all `'O'`s into `'X'`s in that surrounded region. > Explanation: Surrounded regions shouldn’t be on the border, which means that any `'O'` on the border of the board are not flipped to `'X'`. Any `'O'` that is not on the border and it is not connected to an `'O'` on the border will be flipped to `'X'`. Two cells are connected if they are adjacent cells connected horizontally or vertically. > 給予一個二維面板包含`'X'`和`'O'` (字母 O),佔領所有被`'X'`包圍的地區。 > 反轉所有`'O'`使其成為`'X'`來佔領一個區域。 > 解釋: > 被佔領的區域不應該在邊界上,因此任何在邊界上的`'O'`都不應該被反轉為`'X'`。任何`'O'`不在邊界上或是沒有和邊界連接到的都會被翻轉成`'X'`。兩個格子連接是指他們水平或垂直連接。 ## 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 ``` ## Solution * 這一類的題目已經出現好幾次了,一看到2D面板就先想到DFS。 * 我們要做的事情是保留住從邊界上DFS遍歷到的所有`'O'`。 * 我先將`O`轉換為暫時符號`'N'`,接著DFS遍歷所有邊界上的`'N'`,將其轉回`'O'`。最後將所有沒有被遍歷到的暫時符號`'N'`轉成`'X'`。 * 注意邊界限制。 ### Code ```C++=1 class Solution { public: void dfs(vector<vector<char>>& board, int y, int x) { board[y][x] = 'O'; if(y > 0 && board[y - 1][x] == 'N') dfs(board, y - 1, x); if(x > 0 && board[y][x - 1] == 'N') dfs(board, y, x - 1); if(y < board.size() - 1 && board[y + 1][x] == 'N') dfs(board, y + 1, x); if(x < board[0].size() - 1 && board[y][x + 1] == 'N') dfs(board, y, x + 1); } void solve(vector<vector<char>>& board) { if(board.empty()) return; for(int i = 0; i < board.size(); i++) for(int j = 0; j < board[0].size(); j++) if(board[i][j] == 'O') board[i][j] = 'N'; for(int i = 0; i < board.size(); i++) { if(board[i][0] == 'N') dfs(board, i, 0); if(board[i][board[0].size() - 1] == 'N') dfs(board, i, board[0].size() - 1); } for(int j = 0; j < board[0].size(); j++) { if(board[0][j] == 'N') dfs(board, 0, j); if(board[board.size() - 1][j] == 'N') dfs(board, board.size() - 1, j); } for(int i = 0; i < board.size(); i++) for(int j = 0; j < board[0].size(); j++) if(board[i][j] == 'N') board[i][j] = 'X'; } }; ``` ###### tags: `LeetCode` `C++`