由于不想用dfs写,就想了个别的。

这里使用类似于并查集的思想,首先将原本O的位置置位X,并且对于所有O的位置进行记录。记录完毕后对board周围的元素先进行复原,然后从先从左上角开始根据O的记录表参考逐一复原O,然后在从右下角开始往左上角开始逐一复原(矩形对称性)。

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param board char字符型vector<vector<>> 
     * @return char字符型vector<vector<>>
     */
    
        vector<vector<char> > surroundedArea(vector<vector<char> >& board) {
        // write code here
        int n = board[0].size();
        vector<int> bc(board.size()*board[0].size(),-1);
        for(int i = 0; i<board.size(); ++i){
            for(int j =0; j<board[0].size();++j){
                if(board[i][j] == 'O'){
                    board[i][j] = 'X';
                    bc[i*n+j] = 1;
                }
            }
        }
        
        for(int i = 0; i<n;++i){
            if(bc[i] != -1)
                board[0][i] = 'O';
            if(bc[i*n] != -1)
                board[i][0] = 'O';
            if(bc[(n-1)*n+i] != -1)
                 board[n-1][i] = 'O';
            if(bc[n*i+n-1] != -1)
                 board[i][n-1] = 'O';
        }
       for(int i = 0; i<board.size(); ++i){
            for(int j = 0; j<board[0].size();++j){
                    if(i>0 && board[i-1][j]=='O' && bc[i*n+j]!=-1)
                        board[i][j] = 'O';
                    if(j>0 && board[i][j-1]=='O' && bc[i*n+j]!=-1)
                        board[i][j] = 'O';
                }
            }
        for(int i = n-1; i>=0; --i){
            for(int j = n-1; j>=0;--j){
                    if(i<n-1 && board[i+1][j]=='O' && bc[i*n+j]!=-1)
                        board[i][j] = 'O';
                    if(j<n-1 && board[i][j+1]=='O' && bc[i*n+j]!=-1)
                        board[i][j] = 'O';
                }
            }
        return board;
    }
};