版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liuweiyuxiang/article/details/87933326
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
找那些在边界上的O,这些O一定不能转换为X,而且与这些O相连的在内部的O也不能转换为x
步骤:
1.暂时修改那些在边界且与边界相连(深搜找这些点)的点值为*
2.接着修改剩余的值为O的点为X,这些就是surrounded by x的点了
3.接着将值为*的点复原为O
代码:
class Solution {
public:
void solve(vector<vector<char>> &board) {
if (board.size() < 3 || board[0].size() < 3){
return;
}
int row_num = board.size();
int col_num = board[0].size();
for (int i = 0; i < col_num; i++){
dfs(board, 0, i); //上边界
dfs(board, row_num - 1, i); //下边界
}
for (int i = 0; i < row_num; i++){
dfs(board, i, 0); //左边界
dfs(board, i, col_num - 1); //右边界
}
for (int i = 0; i < row_num; i++){
for (int j = 0; j < col_num; j++){
if (board[i][j] == 'O'){
board[i][j] = 'X';
}
if (board[i][j] == '*'){
board[i][j] = 'O';
}
}
}
}
void dfs(vector<vector<char>> &board, int i, int j){
int row_num = board.size();
int col_num = board[0].size();
if (i < 0 || i >= row_num || j < 0 || j >= col_num)
return;
if (board[i][j] != 'O')
return;
board[i][j] = '*';
dfs(board, i, j - 1);
dfs(board, i - 1, j);
dfs(board, i, j + 1);
dfs(board, i + 1, j);
}
};