思路:从边缘开始遍历,遍历到的‘O’做个标记,是不需要被修改的。其他的’O’是可以被修改的。
思路一:bfs
class Solution {
public:
int flag[201][201] = {0};
int xy[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};
void bfs(const vector<vector<char>>& board, int x, int y) {
int n = board.size(), m = board[0].size();
queue<pair<int, int>> q;
q.push({x, y});
flag[x][y] = 1;
while (!q.empty()) {
auto frt = q.front();
q.pop();
int first = frt.first;
int second = frt.second;
for (int i = 0; i < 4; ++i) {
int xx = first + xy[i][0], yy = second + xy[i][1];
if (xx < 0 || yy < 0 || xx >= n || yy >= m) continue;
if (board[xx][yy] == 'O' && !flag[xx][yy]) {
q.push({xx, yy});
flag[xx][yy] = 1;
}
}
}
}
void solve(vector<vector<char>>& board) {
int n = board.size(), m = board[0].size();
for (int j = 0; j < m; ++j) {
if (board[0][j] == 'O' && !flag[0][j]) bfs(board, 0, j);
if (board[n - 1][j] == 'O' && !flag[n - 1][j]) bfs(board, n - 1, j);
}
for (int i = 1; i < n - 1; ++i) {
if (board[i][0] == 'O' && !flag[i][0]) bfs(board, i, 0);
if (board[i][m - 1] == 'O' && !flag[i][m - 1]) bfs(board, i, m - 1);
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (board[i][j] == 'O' && flag[i][j] == 1) board[i][j] = 'O';
else board[i][j] = 'X';
}
}
}
};
思路二:dfs
void dfs(const vector<vector<char>>& board, int x, int y) {
int n = board.size(), m = board[0].size();
flag[x][y] = 1;
for (int i = 0; i < 4; ++i) {
int xx = x + xy[i][0], yy = y + xy[i][1];
if (xx < 0 || xx >= n || yy < 0 || yy >= m) continue;
if (board[xx][yy] == 'O' && !flag[xx][yy]) dfs(board, xx, yy);
}
}