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的连通域 判断此连通域是否被X包围,是则把次连通域中的O转为X,否则继续寻找下一个O。

class Solution {
public:
// 从 i,j开始遍历 寻找字符c的连通域 flag判断区域是否被围
// 通过观察可发现 只要连通域有点是在边界上 就不是被围的 
void dfs(vector< vector<char> > &board,int i,int j,char c,char newc,int &flag){

    //边界检查 
    if(i<board.size()&&i>=0&&j>=0&&j<board[i].size()&&board[i][j]==c){
        //当前点在边界上 
        if(i==0||i==(board.size()-1)||j==0||j==(board[i].size()-1))
            flag=1; //此区域没有被包裹 
      board[i][j]=newc;
      dfs(board,i-1,j,c,newc,flag);
      dfs(board,i,j-1,c,newc,flag);
      dfs(board,i,j+1,c,newc,flag);
      dfs(board,i+1,j,c,newc,flag);
    }

}
    void solve(vector<vector<char>> &board) {
         int flag; 
        for(int i=0;i<board.size();i++){
            for(int j=0;j<board[i].size();j++){

                //寻找此O的连通区域 
                if(board[i][j]=='O'){ 
                flag=0;
                    //把O 转为F防止重复计算dfs 
                    dfs(board,i,j,'O','F',flag);

                //判断此区域是否被X surround

                //被包裹 转换F为X 
                if(!flag){
                    dfs(board,i,j,'F','X',flag);        
                }


              }
            }
        }

        for(int i=0;i<(int)board.size();i++){
            for(int j=0;j<board[i].size();j++){
              //把所有的F恢复原样
              if(board[i][j]=='F')
                dfs(board,i,j,'F','O',flag);    
                }
            } 
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值