leetcode-dfs-130. 被围绕的区域

 

思想很重要

 

class Solution {
public:
    void solve(vector<vector<char>>& board) {
        int m = board.size();
        int n = board[0].size();
        // 从边缘开始,因为四周肯定不被包围,和四周O联通的先调用dfs算法标记为A
        for(int i = 0; i < m; i++){
            dfs(board,i,0);
            dfs(board,i,n-1);
        }
        for(int i = 0; i < n; i++){
            dfs(board,0,i);
            dfs(board,m-1,i);
        }
        // 最后剩下的肯定O肯定是被X包围的
        // 最后只需要将标记为A的复原为O,将其余的O改为X即可
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                if(board[i][j] == 'A')
                    board[i][j] = 'O';
                else if(board[i][j] == 'O')
                    board[i][j] = 'X';
            }
        }
        return;
    }

    void dfs(vector<vector<char>>& board, int i, int j){
        int m = board.size();
        int n = board[0].size();

        if(i>=m||i<0||j>=n||j<0||board[i][j]!='O')
            return;
        board[i][j]='A';
        dfs(board,i+1,j);
        dfs(board,i-1,j);
        dfs(board,i,j+1);
        dfs(board,i,j-1);
    }
};

 

posted @ 2021-08-13 12:04  三一一一317  阅读(23)  评论(0)    收藏  举报