[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

        本题是一个测试连通性的问题,完全归为用BFS。

         思路:

                  1、最外围一圈的O肯定都是没有被围住的,对其进行标记。

                   2、由最外围的O向内扩展,与之相连的O也必定是没有被围住的。

                   3、由以上2步确定的O点向上、下、左、右四个方向扩展,如果遇到的O也是没被围住的

                    所以,对上述点进行标记。这些点就是保持到最后没有被围住的O点。

         小技巧:对于坐标(x,y)需要用一个pair<int,int>来维护的情况,可以转化为一个数值存储x*n+y,方便还原。可以节省空间。


class Solution {
public:
      int m,n;
      void solve(vector<vector<char> > &board) {
            if(board.size()==0) return;

             m=board.size();
             n=board[0].size();
            for(int i=0;i<n;i++){
                bfs(board,0,i);
                bfs(board,m-1,i);
            }
            for(int j=1;j<m-1;j++){
                bfs(board,j,0);
                bfs(board,j,n-1);
            }
            
            for(int i=0;i<m;i++)
                for(int j=0;j<n;j++)
                {
                    if(board[i][j]=='O')
                         board[i][j]='X';
                    else if(board[i][j]=='E')
                         board[i][j]='O';
                }

      }
private:
      void bfs(vector<vector<char> > &board,int i,int j){
            queue<int> q;
            visit(board,i,j,q);
            while(!q.empty()){
                int cur=q.front();q.pop();
                const int x=cur/n;
                const int y=cur%n;
                visit(board,x-1,y,q);
                visit(board,x,y-1,q);
                visit(board,x+1,y,q);
                visit(board,x,y+1,q);
            }
      }

      void visit(vector<vector<char> > &board,int i, int j,queue<int> &q){
            if(i<0 || i>m-1 ||j<0 || j>n-1 || board[i][j]!='O')
                return;
            board[i][j]='E'; //既有标记功能,又有去重功能
            q.push(i*n+j);
      }
};



http://blog.csdn.net/a83610312/article/details/8959099

https://gitcafe.com/soulmachine/LeetCode








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值