• 【leetcode】Surrounded Regions


    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
    
     
     
    用dfs试试,大数据时递归会溢出
     1 class Solution {
     2 public:
     3     void solve(vector<vector<char>> &board) {
     4         int m=board.size();
     5         if(m==0) return;
     6         int n=board[0].size();
     7        
     8         vector<vector<bool>> visited(m,vector<bool>(n,false));
     9         for(int i=0;i<m;i++)
    10         {
    11             if(board[i][0]=='O'&&!visited[i][0])
    12             {
    13                 dfs(board,visited,i,0,m,n);
    14             }
    15            
    16             if(board[i][n-1]=='O'&&!visited[i][n-1])
    17             {
    18                 dfs(board,visited,i,n-1,m,n);
    19             }
    20         }
    21        
    22         for(int j=0;j<n;j++)
    23         {
    24            
    25             if(board[0][j]=='O'&&!visited[0][j])
    26             {
    27                 dfs(board,visited,0,j,m,n);
    28             }
    29            
    30             if(board[m-1][j]=='O'&&!visited[m-1][j])
    31             {
    32                 dfs(board,visited,m-1,j,m,n);
    33             }
    34            
    35         }
    36        
    37        
    38         for(int i=0;i<m;i++)
    39         {
    40             for(int j=0;j<n;j++)
    41             {
    42                 if(board[i][j]=='O'&&visited[i][j])
    43                 {
    44                     board[i][j]='X';
    45                 }
    46             }
    47         }
    48        
    49         return;
    50     }
    51    
    52     void dfs(vector<vector<char>> &board,vector<vector<bool>> &visited,int i,int j,int &m,int &n)
    53     {
    54         if(board[i][j]=='O')
    55         {
    56             visited[i][j]=true;
    57             if(i+1<m&&visited[i+1][j]==false)dfs(board,visited,i+1,j,m,n);
    58             if(j+1<n&&visited[i][j+1]==false)dfs(board,visited,i,j+1,m,n);
    59             if(i-1>=0&&visited[i-1][j]==false)dfs(board,visited,i-1,j,m,n);
    60             if(j-1>=0&&visited[i][j-1]==false)dfs(board,visited,i,j-1,m,n);
    61         }
    62         else
    63         {
    64             return;
    65         }
    66     }       
    67 };

     

    利用广度优先搜索,先把边界上的O全部放到队列中,然后搜索
     
     1 class Solution {
     2 public:
     3     void solve(vector<vector<char>> &board) {
     4         int m=board.size();
     5         if(m==0) return;
     6         int n=board[0].size();
     7        
     8         queue<pair<int,int>> q;
     9        
    10         vector<vector<bool>> visited(m,vector<bool>(n,false));
    11         for(int i=0;i<m;i++)
    12         {
    13             if(board[i][0]=='O') q.push(pair<int,int>(i,0));
    14             if(board[i][n-1]=='O')  q.push(pair<int,int>(i,n-1));
    15         }
    16        
    17         for(int j=0;j<n;j++)
    18         {
    19             if(board[0][j]=='O')  q.push(pair<int,int>(0,j));
    20             if(board[m-1][j]=='O')  q.push(pair<int,int>(m-1,j));
    21         }
    22        
    23         bfs(q,board,visited,m,n);
    24        
    25         for(int i=0;i<m;i++)
    26         {
    27             for(int j=0;j<n;j++)
    28             {
    29                 if(!visited[i][j]&&board[i][j]=='O')  board[i][j]='X';
    30             }
    31         }
    32     }
    33    
    34    
    35     void bfs(queue<pair<int,int>> &q,vector<vector<char>> &board,vector<vector<bool>> &visited,int &m,int &n)
    36     {
    37         while(!q.empty())
    38         {
    39             int ii=q.front().first;
    40             int jj=q.front().second;
    41             visited[ii][jj]=true;
    42                    
    43             q.pop();
    44                    
    45             if(ii+1<m&&!visited[ii+1][jj]&&board[ii+1][jj]=='O') q.push(pair<int,int>(ii+1,jj));
    46             if(ii-1>=0&&!visited[ii-1][jj]&&board[ii-1][jj]=='O') q.push(pair<int,int>(ii-1,jj));
    47             if(jj+1<n&&!visited[ii][jj+1]&&board[ii][jj+1]=='O') q.push(pair<int,int>(ii,jj+1));
    48             if(jj-1>=0&&!visited[ii][jj-1]&&board[ii][jj-1]=='O') q.push(pair<int,int>(ii,jj-1));
    49         }
    50     }
    51 };
  • 相关阅读:
    mockm remote 不能正常使用的解决方案
    uviewui 的 bug 当 url 的 query 参数中有 http://127.0.0.1/ 并且省略请求前缀的时候, 就会导致请求无法发送出去
    检查 nodmeon 是否可以修改文件后重启应用
    mocha 如何延迟指定时间后再运行所有用例
    使用 babel 编译 js 为 es5 支持 ie
    git 摘取提交
    Makefile学习笔记
    使用 Service Worker 缓解网站 DDOS 攻击
    如何热更新长缓存的 HTTP 资源
    网站图片无缝兼容 WebP/AVIF
  • 原文地址:https://www.cnblogs.com/reachteam/p/4240014.html
Copyright © 2020-2023  润新知