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.
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
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.
#include <iostream>
#include <vector>
using namespace std;
void traverseBorder(vector<vector<char>>& board, int i, int j){
if(i < 0 || i >= board.size() || j < 0 || j >= board[0].size() || board[i][j] != 'O')
return;
board[i][j] = '#';
traverseBorder(board, i + 1, j);
traverseBorder(board, i - 1, j);
traverseBorder(board, i, j + 1);
traverseBorder(board, i, j - 1);
}
void solve(vector<vector<char>>& board) {
if(board.empty() || board[0].empty()) return;
int row = board.size();
int col = board[0].size();
if(row < 3 || col < 3)
return;
for(int i = 0; i < col; ++i)
if(board[0][i] == 'O')
traverseBorder(board, 0, i);
for(int i = 0; i < col; ++i)
if(board[row - 1][i] == 'O')
traverseBorder(board, row - 1, i);
for(int i = 0; i < row; ++i)
if(board[i][0] == 'O')
traverseBorder(board, i, 0);
for(int i = 0; i < row; ++i)
if(board[i][col - 1] == 'O')
traverseBorder(board, i, col - 1);
for(int i = 0; i < row; ++i){
for(int j = 0; j < col; ++j){
if(board[i][j] == 'O')
board[i][j] = 'X';
if(board[i][j] == '#')
board[i][j] = 'O';
}
}
}