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
answer:
typedef struct{
int x, y;
}Node;
class Solution {
public:
void solve(vector<vector<char> >& board) {
int row = board.size();
if(row == 0) return;
int col = board[0].size();
bool visit[row * col] = {false};
vector<Node> cube;
for(int i = 0; i < row; i ++){
for(int j = 0; j < col; j ++){
if(board[i][j] == 'O' && !visit[i * col + j]){
bool change = true;
Node node = {i, j};
cube.push_back(node);
visit[i * col + j] = true;
int start = 0;
while(start < cube.size()){
Node temp = cube[start];
if(temp.x > 0){
int neighber = (temp.x - 1) * col + temp.y;
Node near = {temp.x - 1, temp.y};
if(!visit[neighber] && board[temp.x - 1][temp.y] == 'O'){
cube.push_back(near);
visit[neighber] = true;
}
}
else
change = false;
if(temp.y < col - 1){
int neighber = temp.x * col + temp.y + 1;
Node near = {temp.x, temp.y + 1};
if(!visit[neighber] && board[temp.x][temp.y + 1] == 'O'){
cube.push_back(near);
visit[neighber] = true;
}
}
else change = false;
if(temp.x < row - 1){
int neighber = (temp.x + 1) * col + temp.y;
Node near = {temp.x + 1, temp.y};
if(!visit[neighber] && board[temp.x + 1][temp.y] == 'O'){
cube.push_back(near);
visit[neighber] = true;
}
}
else change = false;
if(temp.y > 0){
int neighber = temp.x * col + temp.y - 1;
Node near = {temp.x, temp.y - 1};
if(!visit[neighber] && board[temp.x][temp.y - 1] == 'O'){
cube.push_back(near);
visit[neighber] = true;
}
}
else change = false;
start ++;
}
if(change){
for(int i = 0; i < cube.size(); i ++){
Node temp = cube[i];
board[temp.x][temp.y] = 'X';
}
}
cube.clear();
}
}
}
}
};