zoukankan      html  css  js  c++  java
  • [LeetCode] 130. Surrounded Regions

    Medium

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

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

    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
    

    Explanation:

    Surrounded regions shouldn’t be on the border, which means that any 'O' on the border of the board are not flipped to 'X'. Any 'O' that is not on the border and it is not connected to an 'O' on the border will be flipped to 'X'. Two cells are connected if they are adjacent cells connected horizontally or vertically.

    题目大意:给出一个X和O的棋盘,把被X包围的O变成X,在边上的O不算被包围。和边上的O连通的O也不算被包围。

    方法:

    先检索棋盘的四条边,当边上的元素是‘O’时再从这个点开始向内扩张找到所有和他连通的O。先把不被包围的O变成一个特殊符号用于标志,比如变成#,检索完所有元素后再把棋盘中所有的O变成X,#变成O就好了。

    从边上的O向内探索连通的O就用到了DFS。

    方法一:递归DFS

    使用递归的方式完成DFS,代码如下

    class Solution {
    public:
        void solve(vector<vector<char>>& board) {
            if(board.empty() || board[0].empty())return;
            int n=board.size(),m=board[0].size();
            for(int i=0,j=0;j<m;++j){
                if(board[i][j]=='O'){
                  helper(board,i,j);  
                }
            }
            for(int i=0,j=m-1;i<n;++i){
                if(board[i][j]=='O'){
                  helper(board,i,j);  
                }
            }
            for(int i=n-1,j=m-1;j>=0;--j){
                if(board[i][j]=='O'){
                  helper(board,i,j);  
                }
            }
            for(int i=n-1,j=0;i>=0;--i){
                if(board[i][j]=='O'){
                  helper(board,i,j);  
                }
            }
            for(int i=0;i<n;++i){
                for(int j=0;j<m;++j){
                    if(board[i][j]=='#'){board[i][j]='O';}
                    else if(board[i][j]=='O'){board[i][j]='X';}
                }
            }
            return;
        }
        void helper(vector<vector<char>> &board,int i,int j){
            board[i][j]='#';
            if(i>0 && board[i-1][j]=='O'){helper(board,i-1,j);}
            if(i<board.size()-1 && board[i+1][j]=='O'){helper(board,i+1,j);}
            if(j>0 && board[i][j-1]=='O'){helper(board,i,j-1);}
            if(j<board[i].size()-1 && board[i][j+1]=='O'){helper(board,i,j+1);}
        }
    };

    方法二:迭代DFS

    使用队列queue记录连通的O的位置,然后检索他的上下左右各位是不是O,是的话就把他记录成#,并把他的位置也放入队列中,等待检索。

    代码如下:

    class Solution {
    public:
        void solve(vector<vector<char>>& board) {
          if(board.empty() || board[0].empty())return;
          int n = board.size(), m = board[0].size();
          vector<vector<int>> director = { {0,1},{1,0},{0,-1},{-1,0} };
          int i = 0, j = 0;
          queue<int> q;
          for (auto d : director) {
             while (i >= 0 && i < board.size() && j >= 0 && j < board[i].size()) {
                if (board[i][j] == 'O') { 
                    board[i][j] = '#';
                    q.push(i*n+j); 
                 }
                 i = i + d[0], j = j + d[1];
              }
              if (i < 0) { i = 0; }
              if (i >= board.size()) { i = board.size() - 1; }
              if (j < 0) { j = 0; }
              if (j >= board[i].size()) { j = board[i].size() - 1; }
          }
          while (!q.empty()) {
             int x = q.front() / n, y = q.front() % n;
              q.pop();
              if (x > 0 && board[x - 1][y] == 'O') {
                 board[x-1][y] = '#';
                 q.push((x - 1)*n + y);
              }
              if (y > 0 && board[x][y - 1] == 'O') {
                 board[x][y - 1] = '#';
                 q.push(x*n + y - 1);
              }
              if (x < board.size()-1 && board[x+1][y] == 'O') {
                 board[x + 1][y] = '#';
                 q.push((x + 1)*n + y);
              }
              if (y < board.size() - 1 && board[x][y + 1] == 'O') {
                 board[x][y + 1] = '#';
                 q.push(x*n + y + 1);
              }
          }
          for (int i = 0; i < n; ++i) {
             for (int j = 0; j < m; ++j) {
                 if (board[i][j] == '#') { board[i][j] = 'O'; }
                 else if (board[i][j] == 'O') { board[i][j] = 'X'; }
             }
          }
          return;
      }
    };
  • 相关阅读:
    Windows的本地时间(LocalTime)、系统时间(SystemTime)、格林威治时间(UTC-Time)、文件时间(FileTime)之间的转换
    python基础day05
    靠谱的Pycharm安装详细教程
    15.Spring-Boot中使用AOP统一处理web层异常
    16.Spring-Boot中的定时任务
    17.Spring-Boot中HTTPS配置
    18.Spring-Boot devtools项目自动重启
    纯Java配置SpringMvc整合Spring-Data-JPA
    19.Spring-Boot多数据源配置
    1.初识Spring-Cloud
  • 原文地址:https://www.cnblogs.com/cff2121/p/11671282.html
Copyright © 2011-2022 走看看