1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| class Solution { public: vector<vector<int> > dir = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; void solve(vector<vector<char>>& board) { int n = board.size(), m = board[0].size(); if(n==0 || m==0) return;
int dummy = m*n; for(int i = 0; i < n*m; i++) { fa[i] = i; sz[i] = 1; } for(int i = 0; i < n; i++) { if(board[i][0] == 'O') merge(i*m, dummy); if(board[i][m-1] == 'O') merge(i*m+m-1, dummy); }
for(int i = 0; i < m; i++) { if(board[0][i] == 'O') merge(i, dummy); if(board[n-1][i] == 'O') merge((n-1)*m+i, dummy); }
for(int i = 1; i < n-1; i++) { for(int j = 1; j < m-1; j++) { if(board[i][j] == 'O') { for(int k = 0; k < 4; k++) { int x = i + dir[k][0]; int y = j + dir[k][1]; if(board[x][y] == 'O') { merge(x*m+y, i*m+j); } } } } }
for(int i = 1; i < n-1; i++) { for(int j = 1; j < m-1; j++) { if(!connected(i*m+j, dummy)) board[i][j] = 'X'; } } }
void merge(int x, int y) { int rootX = find(x); int rootY = find(y);
if(rootX == rootY) return; if(sz[rootX] > sz[rootY]) { fa[rootY] = rootX; sz[rootX] += sz[rootY]; } else { fa[rootX] = rootY; sz[rootY] += sz[rootX]; } }
int find(int x) { while(fa[x] != x) { fa[x] = fa[fa[x]]; x = fa[x]; }
return x; }
bool connected(int x, int y) { int rootX = find(x); int rootY = find(y);
return rootX==rootY; }
private: unordered_map<int, int> fa, sz; };
|