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
用 DFS , UNION-FIND 都行。关键是要想到图形学中的 flood fill, 从边缘boarder开始
class UnionFind {
vector<int> id;
vector<int> rank;
int count;
public:
UnionFind( int n ): count(n) {
id.resize(n, 0);
rank.resize(n,0);
for( int i = 0; i < n; i++ ) {
id[i] = i;
}
}
int find( int i ) {
while( i != id[i]) {
id[i] = id[id[i]];
i = id[i];
}
return i;
}
bool is_connected(int p, int q) {
int i = find(p);
int j = find(q);
if( i != j) return false;
return true;
}
void union_by_rank( int p , int q) {
int i = find(p);
int j = find(q);
if (i == j) return;
if (rank[i] < rank[j]) id[i] = j;
else if (rank[i] > rank[j]) id[j] = i;
else {
id[i] = j;
rank[j]++;
}
count--;
}
};
class Solution {
public:
void solve(vector<vector<char>>& board) {
if(board.empty() || board[0].empty()) return;
const int M = board.size(), N = board[0].size();
UnionFind uf(M*N + 1);
for( int i = 0; i < M ; i++) {
for( int j = 0; j < N; j++) {
if( i == 0 || i == M - 1 || j == 0 || j == N - 1 ) {
if(board[i][j] == 'O')
uf.union_by_rank( i*N + j , M*N);
}
else if( board[i][j] == 'O' ) {
if( board[i-1][j] == 'O') {
uf.union_by_rank( i*N + j, (i-1)*N+j);
}
if( board[i+1][j] == 'O') {
uf.union_by_rank( i*N + j, (i+1)*N+j);
}
if( board[i][j-1] == 'O') {
uf.union_by_rank( i*N + j, i*N+j-1 );
}
if( board[i][j+1] == 'O') {
uf.union_by_rank( i*N + j, i*N+j+1);
}
}
}
}
for( int i = 0; i < M ; i++ ) {
for( int j = 0; j < N; j++ ) {
if(!uf.is_connected( i*N + j, M*N)) {
board[i][j] = 'X';
}
}
}
return;
}
};