@@ -182,7 +182,94 @@ void solve_non_recursively(vector< vector<char> > &board) {
182182 }
183183}
184184
185+
186+ // refers to <Algorithm> 4th edition.
187+ class UnionFind {
188+ int count_; // number of components
189+ int * rank_; // to limits tree hights
190+ int * id_; // id[i] parent of i
191+ public:
192+ UnionFind (int n) {
193+ count_ = n;
194+ rank_ = new int [n];
195+ id_ = new int [n];
196+ for (int i = 0 ; i < n; i++) {
197+ id_[i] = i;
198+ rank_[i] = 0 ;
199+ }
200+ }
201+
202+ ~UnionFind () {
203+ delete [] rank_;
204+ delete [] id_;
205+ }
206+
207+ int count () { return count_; }
208+
209+ int find (int p) {
210+ while (p != id_[p]) {
211+ id_[p] = id_[id_[p]]; // path compression
212+ p = id_[p];
213+ }
214+ return p;
215+ }
216+
217+ bool connected (int p, int q) {
218+ return find (p) == find (q);
219+ }
220+
221+ void connect (int p, int q) {
222+ int i = find (p);
223+ int j = find (q);
224+ if (i == j) return ;
225+ if (rank_[i] < rank_[j]) id_[i] = j;
226+ else if (rank_[i] > rank_[j]) id_[j] = i;
227+ else { // ==
228+ id_[j] = i;
229+ rank_[i]++;
230+ }
231+ count_--;
232+ }
233+ };
234+
235+ class Solution {
236+ public:
237+ void solve (vector<vector<char > >& board) {
238+ int n = board.size ();
239+ if (n == 0 ) return ;
240+ int m = board[0 ].size ();
241+
242+ UnionFind uf (n*m+1 );
243+ for (int i = 0 ; i < n; i++) {
244+ for (int j = 0 ; j < m; j++) {
245+ if (i == 0 || i == n-1 || j == 0 || j == m-1 ) { // side case, connect to dummy node
246+ uf.connect (i*m + j, n*m);
247+ continue ;
248+ }
249+ char c = board[i][j]; // inner case, connect to same neighbor
250+ if (board[i+1 ][j] == c) uf.connect ((i+1 )*m + j, i*m + j);
251+ if (board[i-1 ][j] == c) uf.connect ((i-1 )*m + j, i*m + j);
252+ if (board[i][j+1 ] == c) uf.connect (i*m + (j+1 ), i*m + j);
253+ if (board[i][j-1 ] == c) uf.connect (i*m + (j-1 ), i*m + j);
254+ }
255+ }
256+
257+ for (int i = 0 ; i < n; i++) {
258+ for (int j = 0 ; j < m; j++) {
259+ if (board[i][j] == ' O' && !uf.connected (i*m + j, n*m)) {
260+ board[i][j] = ' X' ;
261+ }
262+ }
263+ }
264+ }
265+ };
266+
267+
185268void solve (vector< vector<char > > &board) {
269+ if (rand () % 2 ) {
270+ Solution ().solve (board);
271+ return ;
272+ }
186273 // Runtime Error for 250 x 250 matrix
187274 /* solve_recursively(board); */
188275 solve_non_recursively (board);
0 commit comments