Note:
遍历四个边,从边上的O开始,找到所有联通的,说明这些是不会被变成X的,打个标记以后,其他的O全变成X就可以了
代码如下:
class Solution {
public:
int m, n;
vector<vector<char>> board;
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
void dfs(int x, int y){
board[x][y] = '#';
for(int i = 0; i < 4; i ++){
int a = x + dx[i], b = y + dy[i];
if(a < 0 || a >= m || b < 0 || b >= n || board[a][b] != 'O') continue;
dfs(a, b);
}
}
void solve(vector<vector<char>>& _board) {
board = _board;
m = board.size();
if(!m) return;
n = board[0].size();
for(int i = 0; i < n; i ++){
if(board[0][i] == 'O') dfs(0, i);
if(board[m - 1][i] == 'O') dfs(m - 1, i);
}
for(int i = 0; i < m; i ++){
if(board[i][0] == 'O') dfs(i, 0);
if(board[i][n - 1] == 'O') dfs(i, n - 1);
}
for(int i = 0; i < m; i ++)
for(int j = 0; j < n; j ++){
if(board[i][j] != '#') board[i][j] = 'X';
if(board[i][j] == '#') board[i][j] = 'O';
}
_board = board;
}
};