130. 被围绕的区域

深度优先遍历 DFS ;

分析:只要与边界接触且值为'o'的相邻的'o'区域都为不可变,其他的都为可变,所以只需要遍历四个边界即可

需要辅助数组 vector<vector<int>> sample(m,vector<int>(n,1)) ; 值为0时标记为不可变

1. 遍历四个边界遇到‘O’将其标记为不可变,并且向四周延申,将与'O'相邻且未标记为不可变(0)的元素皆标记为不可变(0)

class Solution {
public:
/*只需要判断,相邻的所有区域是否与边界相连即可
如果与当前块相邻的最外侧元素为0则不需要转换,否则需要转换
*/
    void solve(vector<vector<char>>& board) {
        if(board.empty()){
            return;
        }
        int m = board.size();
        int n = board[0].size();
        vector<vector<int>> sample(m,vector<int>(n,1));
        int x = 0;
        int y = 0;
        while(true){
            if(board[x][y] == 'O'){
                if(sample[x][y] == 1) check(board,sample,x,y,m,n);
            }
            // 向右走
            if(x == 0&&y!=(n-1)){
                y++;
                continue;
            }else if(y == n-1&&x!=(m-1)){  // 向下走
                x++;
            }else if(x ==m-1&&y!=0){ // 向左走
                y--;
            }else if(y==0&&x!=0){ //向上走
                x--;
            }
            if(x==0&&y==0){
                break;
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(board[i][j] =='O' &&sample[i][j] == 1){
                    board[i][j] = 'X';
                }
            }
        }
    }
    /*将所有与边界上为'O'相邻的区域标记为不更改*/
    void check(vector<vector<char>>& board,vector<vector<int>>& sample,int x,int y,int m,int n){
        // 将当前点设置为不可变
        sample[x][y] = 0;  
        queue<pair<int,int>> q;
        q.push(make_pair(x,y)); 
        // 判断四个方向都没有为 ‘o’的值位置,或者当前值为‘o’且sample=0;
        while(!q.empty()){
            pair<int,int> p = q.front();
            q.pop();
            x = p.first;
            y = p.second;
            // cout<<x<<y<<endl;
            if((x-1)>=0&&board[x-1][y] == 'O' && sample[x-1][y] == 1){
                // 将左侧的入列
                q.push(make_pair(x-1,y));
                sample[x-1][y] = 0;    // 将当前点标记为不可变
            }
            if((y-1)>=0&&board[x][y-1] == 'O' &&sample[x][y-1] == 1){
                q.push(make_pair(x,y-1));
                sample[x][y-1] = 0;    // 将当前点标记为不可变
            }
            if((x+1)<m&&board[x+1][y] == 'O' &&sample[x+1][y] == 1){
                q.push(make_pair(x+1,y));
                sample[x+1][y] = 0;    // 将当前点标记为不可变
            }
            if((y+1)<n&&board[x][y+1] == 'O' &&sample[x][y+1]== 1){
                q.push(make_pair(x,y+1));
                sample[x][y+1] = 0;    // 将当前点标记为不可变
            }
        }
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值