Surrounded Regions

406 篇文章 0 订阅
406 篇文章 0 订阅

1,题目要求

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”(字母O)的2D板,捕获由“X”包围的所有区域。

通过将所有’O’翻转到该周围区域中的’X’来捕获区域。

说明:
包围区域不应位于边界上,这意味着板边框上的任何“O”都不会翻转为“X”。 任何不在边框上并且未连接到边框上的“O”的“O”将翻转为“X”。 如果它们是水平或垂直连接的相邻单元,则连接两个单元。

2,题目思路

对于这道题,要求将被X所包围的O变为X。

这个问题,有点像“围棋”,即只有所有被X所围住的O才会被设置为X。

在观察之后,我们可以发现,只要是在边界上的O,就一定无法被X所包围。

		 X X X X           X X X X             X X X X
         X X O X  ->       X X O X    ->       X X X X
         X O X X           X 1 X X             X O X X
         X O X X           X 1 X X             X O X X

因此,我们可以从边界出发,利用DFS的方式,如果边界上有O,那么久从这个O出发,将所有与这个O相连的O都设置为‘1’。
当我们将整个board都设置好后,将当前board中剩下的‘O’都设置为‘X’。
最后,再将当前board中的1都设置为‘O’即可。

3,代码实现

static auto speedup = [](){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    return nullptr;
}();

class Solution {
public:
    void solve(vector<vector<char>>& board) {
        row = board.size();
        if(row == 0)
            return;
        col = board[0].size();
        
        int i, j;
        
        //在第一列和最后一列上操作
        for(i = 0;i<row;i++){
            checkConnect(board, i, 0);
            if(col > 1) //说明最后一列和第一列不是同一列
                checkConnect(board, i, col-1);
        }
        
        //在第一行和最后一行操作
        //其中最左和最右的元素已经被操作过了
        for(int j = 1;j<col-1;j++){
            checkConnect(board, 0, j);
            if(row > 1)
                checkConnect(board, row-1, j);
        }
        
        //将当前图中所有的'O'转为X
        for(auto &b : board)
            for(auto &bb : b)
                if(bb == 'O')
                    bb = 'X';
        
        //将图中所有的'1'转为'O'
        for(auto &b : board)
            for(auto &bb : b)
                if(bb == '1')
                    bb = 'O';
        
        return;
    }
private:
    int row, col;
    void checkConnect(vector<vector<char>> &board, int i, int j){
        if(board[i][j] == 'O'){
            board[i][j] = '1';
        //之所以是>1而不是>=1,是因为边界处已经被判断过了
        if(i > 1)
            checkConnect(board,i-1,j);
        if(j > 1)
            checkConnect(board,i,j-1);
        if(i < row-2)
            checkConnect(board,i+1,j);
        if(j < col-2)
            checkConnect(board,i,j+1);
        }
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值