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;  };
  |