zoukankan      html  css  js  c++  java
  • leetcode 130 Surrounded Regions(BFS)

    Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'.

    A region is captured by flipping all 'O's into 'X's in that surrounded region.

    For example,

    X X X X
    X O O X
    X X O X
    X O X X
    

    After running your function, the board should be:

    X X X X
    X X X X
    X X X X
    X O X X

    题解:这道题测试数据卡的很严。一开始用dfs爆栈了,后来改成bfs又超时了。。最后改进了下:先查边上有没有‘O’,和边上连着的肯定不会被围住。把这些都标记出来以后,剩下的里面的‘O’必然都要变成‘X’。
    class Solution {
    public:
        int n,m;
        int dx[4]={0,0,1,-1};
        int dy[4]={1,-1,0,0};
        vector<vector<char> >flag;
    
        void bfs(vector<vector<char> >& board,int x,int y){
            queue<pair<int,int> >q;
            q.push(make_pair(x,y));
            flag[x][y]=1;
            
            while(!q.empty()){
                int qx=q.front().first;
                int qy=q.front().second;
                q.pop();
                for(int i=0;i<4;i++){
                    int tx=qx+dx[i];
                    int ty=qy+dy[i];
                    if(tx>=0&&tx<n&&ty>=0&&ty<m&&flag[tx][ty]==0&&board[tx][ty]=='O'){
                        q.push(make_pair(tx,ty));
                        flag[tx][ty]=1;
                    }
                }
            }
        }
    
        void solve(vector<vector<char> >& board) {
            if(board.empty()){
                return ;
            }
            n=board.size();
            m=board[0].size();
            flag.resize(n);
            for(int i=0;i<n;i++){
                flag[i].resize(m,0);
            }
            
            for(int i=0;i<m;i++){
                if(board[0][i]=='O'&&flag[0][i]==0){
                    bfs(board,0,i);
                }
                if(board[n-1][i]=='O'&&flag[n-1][i]==0){
                    bfs(board,n-1,i);
                }
            }
            
            for(int i=1;i<=n-2;i++){
                if(board[i][0]=='O'&&flag[i][0]==0){
                    bfs(board,i,0);
                }
                if(board[i][m-1]=='O'&&flag[i][m-1]==0){
                    bfs(board,i,m-1);
                }
            }
            
            for(int i=0;i<n;i++){
                for(int j=0;j<m;j++){
                    if(board[i][j]=='O'&&flag[i][j]==0){
                        board[i][j]='X';
                    }
                }
            }
        }
    };
  • 相关阅读:
    构造 BestCoder Round #52 (div.2) 1001 Victor and Machine
    multiset || 线段树 HDOJ 4302 Holedox Eating
    BFS(最短路) HDOJ 4308 Saving Princess claire_
    组合数专题
    余数专题
    数论 HDOJ 5407 CRB and Candies
    异或+构造 HDOJ 5416 CRB and Tree
    构造 HDOJ 5414 CRB and String
    背包DP HDOJ 5410 CRB and His Birthday
    博客贴自定义高亮代码
  • 原文地址:https://www.cnblogs.com/zywscq/p/5222180.html
Copyright © 2011-2022 走看看