Surrounded Regions

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.

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 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 Y X X             X O X X
         X O X X           X Y X X             X O X X

按照这个思路写了代码,结果很好,编译错误解决后居然一次AC了。看了看discuss,思路果然和我一样~

代码在找外围的O时,用了两套循环,这里是可以改进的,很简单,我就不做修改了,贴上原先的代码:

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值