Problem:
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
Analysis:
Solutions:
C++:
void SearchReplace(vector<vector<char> > &board, int row, int col, char replace)
{
board[row][col] = replace;
queue<pair<int, int> > visited;
visited.push(make_pair(row, col));
while(!visited.empty()) {
pair<int, int> curr_pt(visited.front());
visited.pop();
for(int i = -1; i <= 1; ++i) {
if(i == 0 || curr_pt.first + i < 0 || curr_pt.first + i >= board.size()
|| board[curr_pt.first + i][curr_pt.second] != 'O')
continue;
board[curr_pt.first + i][curr_pt.second] = replace;
visited.push(make_pair(curr_pt.first + i, curr_pt.second));
}
for(int i = -1; i <= 1; ++i) {
if(i == 0 || curr_pt.second + i < 0 || curr_pt.second + i >= board[0].size()
|| board[curr_pt.first][curr_pt.second + i] != 'O')
continue;
board[curr_pt.first][curr_pt.second + i] = replace;
visited.push(make_pair(curr_pt.first, curr_pt.second + i));
}
}
}
void solve(vector<vector<char> > &board)
{
if(board.empty())
return;
for(int col = 0; col < board[0].size(); ++col) {
if(board[0][col] == 'O')
SearchReplace(board, 0, col, 'Y');
if(board[board.size() - 1][col] == 'O')
SearchReplace(board, board.size() - 1, col, 'Y');
}
for(int row = 0; row < board.size(); ++row) {
if(board[row][0] == 'O')
SearchReplace(board, row, 0, 'Y');
if(board[row][board[0].size() - 1] == 'O')
SearchReplace(board, row, board[0].size() - 1, 'Y');
}
for(int row = 0; row < board.size(); ++row) {
for(int col = 0; col < board[0].size(); ++col) {
if(board[row][col] == 'O')
board[row][col] = 'X';
else if(board[row][col] == 'Y')
board[row][col] = 'O';
}
}
}
Java
:
Python: