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
class Solution {
public:
bool canChange[1001][1001];
bool walked[1001][1001];
void solve(vector<vector<char>> &board) {
// Note: The Solution object is instantiated only once and is reused by each test case.
if(board.size() == 0) return ;
vector<int> row,col;
for(int i = 0; i < board.size(); i++) {
for(int j = 0; j < board[i].size(); j++) {
if(board[i][j] == 'X') {
canChange[i][j] = false;
walked[i][j] = true;
}
else {
canChange[i][j] = true;
walked[i][j] = false;
}
if(i == 0 || i == board.size()-1 || j == 0 || j == board[i].size()-1) {
if(board[i][j] == 'O') {
canChange[i][j] = false;
row.push_back(i);
col.push_back(j);
}
}
}
}
for(int i = 0 ; i< row.size(); i++) {
int r = row[i];
int c = col[i];
turn(r,c,board);
}
for(int i = 0; i < board.size(); i++) {
for(int j = 0; j < board[i].size(); j++) {
if(board[i][j] == 'O' && canChange[i][j])
board[i][j] = 'X';
}
}
}
void turn(int r, int c, vector<vector<char>> &board) {
if(r < 0 || r >= board.size()) return ;
if(c < 0 || c >= board[r].size()) return ;
if(walked[r][c]) return;
walked[r][c] = true;
canChange[r][c] = false;
turn(r-1,c,board);
turn(r+1,c,board);
turn(r,c-1,board);
turn(r,c+1,board);
}
};