classSolution { intN=550; int[] p = newint[N * N]; int m, n; int[][] g; intfind(int x) { if (p[x] != x) p[x] = find(p[x]); return p[x]; } booleanquery(int a, int b) { return find(a) == find(b); } voidunion(int a, int b) { p[find(a)] = find(b); } publicintnumEnclaves(int[][] grid) { g = grid; m = g.length; n = g[0].length; for (inti=0; i < m; i++) { for (intj=0; j < n; j++) { p[getIdx(i, j)] = getIdx(i, j); } } for (inti=0; i < m; i++) { for (intj=0; j < n; j++) { if (i == 0 || j == 0 || i == m - 1 || j == n - 1) { if (g[i][j] != 1 || query(getIdx(i, j), 0)) continue; dfs(i, j); } } } intans=0; for (inti=0; i < m; i++) { for (intj=0; j < n; j++) { if (g[i][j] == 1 && !query(getIdx(i, j), 0)) ans++; } } return ans; } int[][] dirs = newint[][]{{1,0},{-1,0},{0,1},{0,-1}}; voiddfs(int x, int y) { union(getIdx(x, y), 0); for (int[] d : dirs) { intnx= x + d[0], ny = y + d[1]; if (nx < 0 || nx >= m || ny < 0 || ny >= n) continue; if (g[nx][ny] != 1 || query(getIdx(nx, ny), 0)) continue; dfs(nx, ny); } } intgetIdx(int x, int y) { return x * n + y + 1; } }