【DFS】130. 被围绕的区域

  1. 无脑深搜两次,一次判断是否位于内部,一次变‘X’
class Solution {
public:
    bool is_inside(int x, int y){
        if (x > 0 && x < len_x - 1 && y > 0 && y < len_y - 1)
            return true;
        return false;
    }

    bool is_legal(int x,int y){
        if (x >= 0 && x < len_x && y >= 0 && y < len_y)
            return true;
        return false;
    }

    void print(vector<vector<char>>& board){
        for(auto b: board){
            for(auto a: b){
                cout << a << " ";
            }
            cout << endl;
        }
        cout << endl;
    }

    bool dfs(vector<vector<char>>& board, vector<vector<bool>> &record, int x, int y,bool is_add_X){
        record[x][y] = true;
        bool flag = true;
        for(int i=0;i<4;++i){
            int target_x = x + dir[i][0];
            int target_y = y + dir[i][1];
            if(!is_add_X){
                if(is_legal(target_x, target_y) && board[target_x][target_y] == 'O' && !record[target_x][target_y]){
                    if(!is_inside(target_x,target_y))
                        flag = false;
                    flag = dfs(board, record, target_x, target_y, false) && flag;
                }
            }
            else{
                if(board[target_x][target_y] == 'O'){
                    board[target_x][target_y] = 'X';
                    dfs(board, record, target_x, target_y, true);
                }
            }
        }
        return flag;
    }

    void solve(vector<vector<char>>& board) {
        len_x = board.size();
        len_y = board[0].size();
        vector<vector<bool>> record(len_x, vector<bool>(len_y, false));
        for(int i=1;i<len_x-1;++i)
            for(int j=1;j<len_y-1;++j){
                if(board[i][j] == 'O' && record[i][j] == false && dfs(board, record, i, j, false)){
                    board[i][j] = 'X';
                    dfs(board, record, i, j, true);
                }
            }    
    }
private:
    int len_x;
    int len_y;
    int dir[4][2] = {
        {0,1},
        {0,-1},
        {-1,0},
        {1,0}
    };
};
  1. 优化版,先深搜边界将O改为T,再修改所有剩下的O
class Solution {
public:
    bool is_inside(int x, int y){
        if (x > 0 && x < len_x - 1 && y > 0 && y < len_y - 1)
            return true;
        return false;
    }

    bool is_legal(int x,int y){
        if (x >= 0 && x < len_x && y >= 0 && y < len_y)
            return true;
        return false;
    }

    void print(vector<vector<char>>& board){
        for(auto b: board){
            for(auto a: b){
                cout << a << " ";
            }
            cout << endl;
        }
        cout << endl;
    }

    void dfs(vector<vector<char>>& board, vector<vector<bool>> &record, int x, int y){
        record[x][y] = true;
        board[x][y] = 'T';
        for(int i=0;i<4;++i){
            int target_x = x + dir[i][0];
            int target_y = y + dir[i][1];
            if(is_legal(target_x, target_y) && board[target_x][target_y] == 'O'
            && !record[target_x][target_y])
                dfs(board, record, target_x, target_y);
        } 
    }

    void solve(vector<vector<char>>& board) {
        len_x = board.size();
        len_y = board[0].size();
        vector<vector<bool>> record(len_x, vector<bool>(len_y, false));
        for(int i=0;i<len_x;++i){
            if(board[i][0] == 'O')
                dfs(board, record, i, 0);
            if(board[i][len_y-1] == 'O')
                dfs(board, record, i, len_y-1);
        }
        for(int j=1;j<len_y-1;++j){
            if(board[0][j] == 'O')
                dfs(board, record, 0, j);
            if(board[len_x-1][j] == 'O')
                dfs(board, record, len_x-1, j);
        }
        for(int i=0;i<len_x;++i)
            for(int j=0;j<len_y;++j)
                if(board[i][j] == 'T')
                    board[i][j] = 'O';
                else if(board[i][j] == 'O')
                    board[i][j] = 'X';

    }
private:
    int len_x;
    int len_y;
    int dir[4][2] = {
        {0,1},
        {0,-1},
        {-1,0},
        {1,0}
    };
};
posted @ 2022-03-01 14:00  fwx  阅读(21)  评论(0)    收藏  举报