Leetcode 130. 被围绕的区域

class Solution {
public:
    queue<pair<int, int>> q;
    // 用来归还之前染过色的节点
    queue<pair<int, int>> q_back;
    
    // 访问标记
    vector<vector<int>> v;
    bool is_back;
    
    
    void check(int x, int y, vector<vector<char>>& grid)
    {
        int m = grid.size();
        int n  = grid[0].size();
        
        if(x >= 0 && x < m && y>=0 && y<n)
        {
            if(grid[x][y] == 'O')
            {
                q.push(make_pair(x,y));
                q_back.push(make_pair(x,y));
                grid[x][y] = 'X';
                v[x][y] = true;
            }
        }
        else
        {
            is_back = true;
        }
    }

    void floodfill(int x, int y, vector<vector<char>>& grid)
    {
        // 默认是不需要还回去的
        is_back = false;
        
        q.push(make_pair(x,y));
        q_back.push(make_pair(x,y));
        
        //进行染色
        grid[x][y] = 'X';
        v[x][y] = true;
        
        while(!q.empty())
        {
            auto tmp = q.front();
            int x_ = tmp.first;
            int y_ = tmp.second;
            q.pop();
            
            check(x_-1,y_,grid);
            check(x_+1,y_,grid);
            check(x_,y_-1,grid);
            check(x_,y_+1,grid); 
        }
        if(is_back)
        {
            while(!q_back.empty())
            {
                auto tmp = q_back.front();
                grid[tmp.first][tmp.second] = 'O';
                q_back.pop();
            }
        }
    }
    
    void solve(vector<vector<char>>& grid) {
        //条件判断
        int m = grid.size();
        if(m==0)
            return;
        int n  = grid[0].size();
        if(n==0)
            return;
        
        // 是否已经访问过了 每个节点仅访问一次、
        v.resize(m, vector<int>(n, false));
        
        for(int i=0; i<m;++i)
        {
            for(int j=0;j<n;++j)
            {
                while(!q_back.empty())
                {
                    q_back.pop();
                }
                if(grid[i][j] == 'O' && v[i][j]==false)
                {
                    floodfill(i,j,grid);
                }
            }
        }
    }
};

猜你喜欢

转载自www.cnblogs.com/randyniu/p/9220889.html