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