zoukankan      html  css  js  c++  java
  • [LeetCode] Surrounded Regions(DFS、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
    
    方法1DFS的Recursive实现,由于递归实现占用额外内存,当递归深度大时出现RunTime Error
    思想是从board的外层四周开始,找到需要替换的‘O’先标记为‘V’,看此‘O’上下左右有没有需要替换的‘O’,不断深入。
      class Solution {
        public:
            typedef vector<vector<char> > BOARDTYPE;
    
            void solve(BOARDTYPE &board) {
                if (board.empty() || board[0].empty()) return;
                int N = board.size(), M = board[0].size();
                for (int i = 0; i < N; ++i)
                    for (int j = 0; j < M; ++j)
                        if (i == 0 || j == 0 || i == N-1 || j == M-1)
                            dfs(board, i, j); // you may call dfs or bfs here!
                for (int i = 0; i < N; ++i)
                    for (int j = 0; j < M; ++j)
                        board[i][j] = (board[i][j] == 'V') ? 'O' : 'X';
            }
    
             void dfs(BOARDTYPE &board, int row, int col) {
                int N = board.size(), M = board[0].size();
                if (row < 0 || row >= N || col < 0 || col >= M) return;
                if (board[row][col] != 'O') return;
                board[row][col] = 'V';//把不需要更改的‘O’设为‘V’.
                dfs(board, row+1, col);
                dfs(board, row-1, col);
                dfs(board, row, col+1);
                dfs(board, row, col-1);
            }
        };

    方法2DFS的stack实现

    It pushes all neighbors into stack, and pick the top one, which is one of the neighbors just pushed in, and further gets its neighbors.

    仔细考虑一下,这个乍一看很容易被认为是BFS的实现。

      class Solution {
        public:
            typedef vector<vector<char> > BOARDTYPE;
    
            void solve(BOARDTYPE &board) {
                if (board.empty() || board[0].empty()) return;
                int N = board.size(), M = board[0].size();
                for (int i = 0; i < N; ++i)
                    for (int j = 0; j < M; ++j)
                        if (i == 0 || j == 0 || i == N-1 || j == M-1)
                            dfs(board, i, j); // you may call dfs or bfs here!
                for (int i = 0; i < N; ++i)
                    for (int j = 0; j < M; ++j)
                        board[i][j] = (board[i][j] == 'V') ? 'O' : 'X';
            }
    
             void dfs(BOARDTYPE &board, int row, int col) {
                int N = board.size(), M = board[0].size();
                if (row < 0 || row >= N || col < 0 || col >= M) return;
                if (board[row][col] != 'O') return;
                stack<pair<int,int>> s;
                s.push(make_pair(row,col));
                board[row][col] = 'V';//把不需要更改的‘O’设为‘V’.
                while(!s.empty()){
                    row = s.top().first;
                    col = s.top().second;
                    s.pop();
                    if(row+1<N && board[row+1][col]=='O'){
                        s.push(make_pair(row+1,col));
                        board[row+1][col]='V';
                    }
                    if(row-1>=0 && board[row-1][col]=='O'){
                        s.push(make_pair(row-1,col));
                        board[row-1][col]='V';
                    }
                    if(col+1<M && board[row][col+1]=='O'){
                        s.push(make_pair(row,col+1));
                        board[row][col+1]='V';
                    }
                    if(col-1<N && board[row][col-1]=='O'){
                        s.push(make_pair(row,col-1));
                        board[row][col-1]='V';
                    }
                }//end while
            }
        };

    方法3BFS的queue实现

     class Solution {
        public:
            typedef vector<vector<char> > BOARDTYPE;
    
            void solve(BOARDTYPE &board) {
                if (board.empty() || board[0].empty()) return;
                int N = board.size(), M = board[0].size();
                queue<pair<int,int>> q;
                
                for (int i = 0; i < N; ++i){
                    if(board[i][M-1]=='O' ){
                        q.push(make_pair(i,M-1));
                        board[i][M-1]='V';     
                    }    
                    if(board[i][0]=='O'){
                        q.push(make_pair(i,0));
                        board[i][0]='V';
                    }
                }
                for (int j = 0; j < M; ++j){
                    if(board[0][j]=='O'){
                        q.push(make_pair(0,j));    
                        board[0][j]='V';
                    }     
                    if( board[N-1][j]=='O'){
                        q.push(make_pair(N-1,j));
                        board[N-1][j]='V';
                    }
                          
                }
                bfs(board,q);
                for (int i = 0; i < N; ++i)
                    for (int j = 0; j < M; ++j)
                        board[i][j] = (board[i][j] == 'V') ? 'O' : 'X';
            }
    
             void bfs(BOARDTYPE &board, queue<pair<int,int>> &q) {
                int N = board.size(), M = board[0].size();
                
                while(!q.empty()){
                    int row = q.front().first;
                    int col = q.front().second;
                    q.pop();
                
                    
                    if(row+1<N && board[row+1][col]=='O'){
                        q.push(make_pair(row+1,col));
                        board[row+1][col]='V';
                    }
                    if(row-1>=0 && board[row-1][col]=='O'){
                        q.push(make_pair(row-1,col));
                        board[row-1][col]='V';
                    }
                    if(col+1<M && board[row][col+1]=='O'){
                        q.push(make_pair(row,col+1));
                        board[row][col+1]='V';
                    }
                    if(col-1<N && board[row][col-1]=='O'){
                        q.push(make_pair(row,col-1));
                        board[row][col-1]='V';
                    }
                }//end while
            }
        };
  • 相关阅读:
    Matlab/Simulink仿真中如何将Scope转化为Figure?
    圆形Camera预览实现
    [转]自定义Drawable实现灵动的红鲤鱼动画(下篇)
    [转]自定义Drawable实现灵动的红鲤鱼动画(上篇)
    EventBus源码分析
    Camera 预览变形问题解决
    使用javacv录像,同时进行讯飞声纹认证
    Camera2必知必会
    Flutter混合工程改造实践
    讯飞语音唤醒SDK集成流程
  • 原文地址:https://www.cnblogs.com/Xylophone/p/3876754.html
Copyright © 2011-2022 走看看