目录
130. 被围绕的区域
转换为逆问题,从边界出发深度遍历首先将不符合的位置标记起来
class Solution {
public:
vector<int> directions {-1, 0, 1, 0, -1};
void dfs(vector<vector<char>>& board, int r, int c) {
board[r][c] = 'A';// 用'A'标记不符合条件的'O'点
for (int k = 0; k < 4; ++k) {
int x = r + directions[k], y = c + directions[k+1];
if (x >= 0 && x < board.size() && y >=0 && y < board[0].size() && board[x][y] == 'O') {
dfs(board, x, y);
}
}
}
void solve(vector<vector<char>>& board) {
int m = board.size(), n = board[0].size();
// 遍历两条纵向边界
for (int i = 0; i < m; ++i) {
if (board[i][0] == 'O'){
dfs(board, i, 0);
}
if (board[i][n-1] == 'O'){
dfs(board, i, n-1);
}
}
// 遍历两条横向边界
for (int j = 0; j < n; ++j) {
if (board[0][j] == 'O') {
dfs(board, 0, j);
}
if (board[m-1][j] == 'O') {
dfs(board, m-1, j);
}
}
// 根据遍历的标记信息将符合条件的'O'替换为'X'
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (board[i][j] == 'O') {
board[i][j] = 'X';
}else if (board[i][j] == 'A') {
board[i][j] = 'O'; // 将不符合条件的恢复
}
}
}
}
};