题目描述:
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.
X X X X
X O O X
X X O X
X O X X
After capture all regions surrounded by 'X'
,
the board should be:
X X X X
X X X X
X X X X
X O X X
这题可以反向思维:如果需要把所有被‘X’包围的‘O’改为‘X’,那么唯一可能不被‘X’包围的情况就是‘O’在board的边上,或者‘O’和在board边上的‘O’相连。这样题目就转化为找在board边上的‘O’以及它们的同党。这样,就先找到所有在board边上的‘O’,对于每一个这样的‘O’,上下左右找它们的同党,并把这类的‘O’都标记为‘.’以作区别。
找完同党以后,就可以把所有剩下的‘O’,也就是那些被‘X’包围的‘O’设为‘X’,而后把那些‘.’设为‘O’了。
Mycode(AC = 26ms):
class Solution {
public:
/**
* @param board a 2D board containing 'X' and 'O'
* @return void
*/
void surroundedRegions(vector<vector<char>>& board) {
// Write your code here
int row = board.size();
if (row == 0) return;
int col = board[0].size();
// for each 'O' on the edges, do bfs
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (i == 0 || j == 0 || i == row - 1 || j == col - 1) {
surroundedRegionsHelper(board, i, j);
}
}
}
// set 'O' to 'X', and set '.' to 'O'
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (board[i][j] == 'O') {
board[i][j] = 'X';
}
}
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (board[i][j] == '.') {
board[i][j] = 'O';
}
}
}
}
// return each edge linked 'O' into '.'
void surroundedRegionsHelper(vector<vector<char>>& board, int row, int col) {
if (board[row][col] == 'X' || board[row][col] == '.') {
return;
}
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
board[row][col] = '.';
for (int i = 0; i < 4; i++) {
int x = row + dx[i];
int y = col + dy[i];
if (x >= 0 && y >= 0 && x < board.size() && y < board[0].size()) {
surroundedRegionsHelper(board, x, y);
}
}
return;
}
};