思路:
连通问题。
直接从四周找‘O’,然后dfs找到所有的连通区域进行标记。
被标记的最后都是可以访问的到的,标记为‘X’;
其余的'O'都是访问不到的,还是‘O’。
class Solution {
private:
int row;
int col;
void expand(int x, int y, vector<vector<char>>& board) {
board[x][y] = 'N';
if(x > 1 && board[x-1][y] == 'O') {
expand(x-1, y, board);
}
if(x < row-2 && board[x+1][y] == 'O') {
expand(x+1, y, board);
}
if(y > 1 && board[x][y-1] == 'O') {
expand(x, y-1, board);
}
if(y < col-2 && board[x][y+1] == 'O') {
expand(x, y+1, board);
}
}
public:
void solve(vector<vector<char>> &board) {
row = static_cast<int>(board.size());
if(row <= 2) return;
col = static_cast<int>(board[0].size());
if(col <= 2) return;
//search top edge 's 'O' && search bottom edge 's 'O'
for(int i = 0; i < col; ++i) {
if(board[0][i] == 'O') {
expand(0, i, board);
}
if(board[row-1][i] == 'O') {
expand(row-1, i, board);
}
}
//search left edge 's 'O' && search right edge 's 'O'
for(int i = 1; i < row - 1; ++i) {
if(board[i][0] == 'O') {
expand(i, 0, board);
}
if(board[i][col-1] == 'O') {
expand(i, col-1, board);
}
}
//set flag
for(int i = 0; i < row; ++i) {
for(int j = 0; j < col; ++j) {
if(board[i][j] == 'N') {
board[i][j] = 'O';
}else if(board[i][j] == 'O') {
board[i][j] = 'X';
}
}
}
}
};