https://leetcode.com/problems/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.
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
Explanation:
Surrounded regions shouldn’t be on the border, which means that any 'O'
on the border of the board are not flipped to 'X'
. Any 'O'
that is not on the border and it is not connected to an 'O'
on the border will be flipped to 'X'
. Two cells are connected if they are adjacent cells connected horizontally or vertically.
简直蠢哭
1.寻找上级是if判断,它本身就是递归了 还用什么while!
2.最后的赋值居然写成了== !!!!
3.并查集的核心在于分堆,那么这个题就要把不满足的分到单独的一堆就可以了!其他堆的都是X,赋值的时候不用纠结之前是什么呀!前几天做的时候用dfs,状态怎么也写不对,并查集才是最好做的!
update:主旨是把边缘的O都连到一个不存在的点上去,那么 所有不被包围的点都会连接到这个不存在的点上去。所以,最后判断每个点是不是都是和不存在的点连着就好了
class Solution {
public:
vector<int> pre;
int find(int x) {
if(pre[x] != x)
pre[x] = find(pre[x]);
return pre[x];
}
void join(int x, int y) {
if (find(x) != find(y))
pre[find(y)] = find(x);
}
void solve(vector<vector<char>>& board) {
int n = board.size();
if (n == 0)
return;
int m = board[0].size();
for (int i = 0; i < n; i ++) {
for (int j = 0; j < m; j ++) {
pre.push_back(i * m + j);
}
}
pre.push_back(n * m);
for (int i = 0; i < n; i ++) {
for (int j = 0; j < m; j ++) {
if (board[i][j] == 'O') {
if (i == 0 || i == n - 1 || j == 0 || j == m - 1)
join(i * m + j, n * m);
else {
if (i - 1 >= 0 && board[i-1][j] == 'O')
join((i - 1) * m + j, i * m + j);
if (j - 1 >= 0 && board[i][j - 1] == 'O')
join(i * m + j - 1, i * m + j);
if (i + 1 < n && board[i + 1][j] == 'O')
join((i + 1) * m + j, i * m + j);
if (j + 1 < m && board[i][j + 1] == 'O')
join(i * m + j + 1, i * m + j);
}
}
}
}
int O = find(n * m);
for (int i = 0; i < n; i ++) {
for (int j = 0; j < m; j ++) {
if(find(i * m + j) != O) {
board[i][j] = 'X';
}
}
}
}
};