• [LeetCode] Surrounded Regions


    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

    思路是从外围是’O'的开始深度往里走,这时候里面的‘O'就有两种命运,一种是跟外围的’O'是联通的,那么这些‘O'就可以存活,剩下的孤立的’O'就没办法了,就只能被‘X'了,为了区分这两种’O',我们把联通 的‘O'改为另外一种统一而独立的字符,便于后期做恢复。这就是三步走(或两步)。

    1)首先从外围的‘O'处深度搜索,见到链接的’O'就把他们都改为其他标识。

    2)将剩余的孤立的’O'改为‘X',同时,将遇到标识符改为’O'。

    简单吧,简单的一塌糊涂,但是这种思路太精髓了。

     深度周游DFS, 大数时会因为递归太深而超时,BFS就不会超时。。

     1 class Solution {
     2     public:
     3         void dfs(vector<vector<char> > &board, int i, int j)
     4         {
     5             size_t row = board.size();
     6             size_t col = board[0].size();
     7 
     8             if(i < 0 || i > row-1 || j < 0 || j > col-1)
     9                 return;
    10             if(board[i][j] != 'O')
    11                 return;
    12             board[i][j] = '*';//tag, in order to reverse back
    13             dfs(board, i, j-1);
    14             dfs(board, i, j+1);
    15             dfs(board, i-1, j);
    16             dfs(board, i+1, j);
    17         }
    18 
    19         void solve(vector<vector<char> > &board)
    20         {
    21             size_t row = board.size();
    22             size_t col = board[0].size();
    23 
    24             // dfs traverse form the up and down
    25             for(int j = 0; j < col; j++)
    26             {   
    27                 dfs(board, 0 ,j);
    28                 dfs(board,row-1, j); 
    29             }   
    30 
    31             // dfs traverse form the left and right 
    32             for(int i = 0; i < row; i++)
    33             {   
    34                 dfs(board, i, 0); 
    35                 dfs(board, i, col-1);
    36             }
    37 
    38             for(int i = 0; i < row; i++)
    39             {
    40                 for(int j = 0; j < col; j++)
    41                 {
    42                     if(board[i][j] == 'O')
    43                         board[i][j] = 'X';
    44                     else if(board[i][j] == '*')
    45                         board[i][j] = 'O';
    46                 }
    47             }
    48 
    49 
    50         }
    51 };

     广度周游BFS

     1 class Solution {
     2             queue<pair<int, int> > m_que;
     3     public:
     4         void dfs(vector<vector<char> > &board, int i, int j)
     5         {
     6             size_t row = board.size();
     7             size_t col = board[0].size();
     8 
     9             if(i < 0 || i > row-1 || j < 0 || j > col-1)
    10                 return;
    11             if(board[i][j] != 'O')
    12                 return;
    13             board[i][j] = '*';//tag, in order to reverse back
    14             dfs(board, i, j-1);
    15             dfs(board, i, j+1);
    16             dfs(board, i-1, j);
    17             dfs(board, i+1, j);
    18         }
    19 
    20         void fill(vector<vector<char> > &board, int x, int y){
    21             size_t row = board.size();
    22             size_t col = board[0].size();
    23 
    24             if(x<0 || x>=row || y<0 || y>=col || board[x][y]!='O')
    25                 return;
    26 
    27             pair<int, int> p ;
    28             p.first = x;
    29             p.second = y;
    30             m_que.push(p);
    31 
    32             board[x][y]='*';
    33         }
    34 
    35 
    36         void bfs(vector<vector<char> > &board, int i, int j)
    37         {
    38             fill(board, i, j);
    39 
    40             while(!m_que.empty())
    41             {
    42                 pair<int, int> p = m_que.front() ;
    43                 m_que.pop();
    44 
    45                 i = p.first;
    46                 j = p.second;
    47 
    48                 fill(board, i, j-1);
    49                 fill(board, i, j+1);
    50                 fill(board, i-1, j);
    51                 fill(board, i+1, j);
    52             }
    53 
    54         }
    55 
    56         void solve(vector<vector<char> > &board)
    57         {
    58             if (board.empty()) return;
    59             size_t row = board.size();
    60             size_t col = board[0].size();
    61 
    62             // dfs traverse form the up and down
    63             for(int j = 0; j < col; j++)
    64             {
    65 #if 0                
    66                 dfs(board, 0 ,j);
    67                 dfs(board,row-1, j);
    68 #endif
    69                 bfs(board, 0 ,j);
    70                 bfs(board,row-1, j);
    71 
    72             }
    73 
    74             // dfs traverse form the left and right 
    75             for(int i = 0; i < row; i++)
    76             {
    77 #if 0
    78                 dfs(board, i, 0);
    79                 dfs(board, i, col-1);
    80 #endif
    81                 bfs(board, i, 0);
    82                 bfs(board, i, col-1);
    83 
    84             }
    85 
    86             for(int i = 0; i < row; i++)
    87             {
    88                 for(int j = 0; j < col; j++)
    89                 {
    90                     if(board[i][j] == 'O')
    91                         board[i][j] = 'X';
    92                     else if(board[i][j] == '*')
    93                         board[i][j] = 'O';
    94                 }
    95             }
    96 
    97 
    98         }
    99 };
  • 相关阅读:
    Android:UI界面设计基础知识总结(一)
    Test:河北金力集团企业网集成
    Java中的异常处理try catch(第八周课堂示例总结)
    Java第七周课堂示例总结
    初入JavaWeb(半成品)
    Redis详解(4)--redis底层数据结构
    Go语言流程控制05--defer延时执行
    java==IO练习,文件切割合拼工具开发代码
    【洛谷 P3772】[CTSC2017]游戏(矩阵乘法+线段树)
    【LOJ #2865】「IOI2018」狼人(Kruscal重构树+扫描线)
  • 原文地址:https://www.cnblogs.com/diegodu/p/3816283.html
Copyright © 2020-2023  润新知