Question:
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.
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
Algorithm:
反过来看,首先边界的四条边的O肯定是不会被包围的,那么与这些O相邻的O也不会被包围,于是我们就要用DFS找到这些O,作标记,然后剩下的就是被包围的
Accepted Code:
class Solution {
public:
void solve(vector<vector<char>>& board) {
if (board.empty())
return;
int M = board.size();
int N = board[0].size();
for (int i = 0; i<M; i++){
DFS(board, i, 0);
DFS(board, i, N - 1);
}
for (int j = 1; (j+1)<N; j++){
DFS(board, 0, j);
DFS(board, M-1, j);
}
for (int i = 0; i<M; i++)
for (int j = 0; j<N; j++){
if (board[i][j] == 'O')
board[i][j] = 'X';
if (board[i][j] == 'S')
board[i][j] = 'O';
}
}
void DFS(vector<vector<char>>& board, int i, int j){
int M = board.size();
int N = board[0].size();
if (board[i][j] == 'O'){
board[i][j] = 'S';
if (i>1 && board[i - 1][j] == 'O') //left 必须是大于1
DFS(board, i - 1, j);
if (i<M-1 && board[i + 1][j]) //right
DFS(board, i + 1, j);
if (j>1 && board[i][j - 1]) //up 必须是大于1
DFS(board, i, j - 1);
if (j<N-1 && board[i][j + 1]) //down
DFS(board, i, j + 1);
}
}
};