Skip to content

Commit b47b45b

Browse files
authored
Merge pull request chipbk10#110 from chipbk10/UnionFind
Solve Problem 1391 - Check if valid path in grid
2 parents 4ab075f + 0fdc23b commit b47b45b

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

src/data/UnionFind.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,7 @@ public boolean union(int i, int j) {
4343
return true;
4444
}
4545

46+
public boolean isConnected(int i, int j) {
47+
return find(i) == find(j);
48+
}
4649
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package graph.unionfind;
2+
3+
import data.UnionFind;
4+
5+
public class Problem1391_CheckIfValidPathInGrid {
6+
7+
// l 0 r(l) 1 r
8+
// i = 2*i+1
9+
// j = 2*j+1
10+
public boolean hasValidPath(int[][] grid) {
11+
int m = grid.length;
12+
int n = grid[0].length;
13+
int t = 2*n + 1;
14+
UnionFind uf = new UnionFind((2*m + 1)*(2*n + 1));
15+
for (int i = 0; i < m; i++) {
16+
for (int j = 0; j < n; j++) {
17+
if (grid[i][j] == 1 || grid[i][j] == 3 || grid[i][j] == 5) {
18+
uf.union(g(2*i + 1, 2*j + 1, t), g(2*i + 1, 2*j, t));
19+
}
20+
if (grid[i][j] == 1 || grid[i][j] == 4 || grid[i][j] == 6) {
21+
uf.union(g(2*i + 1, 2*j + 1, t), g(2*i + 1, 2*j + 2, t));
22+
}
23+
if (grid[i][j] == 2 || grid[i][j] == 3 || grid[i][j] == 4) {
24+
uf.union(g(2*i + 1, 2*j + 1, t), g(2*i + 2, 2*j + 1, t));
25+
}
26+
if (grid[i][j] == 2 || grid[i][j] == 5 || grid[i][j] == 6) {
27+
uf.union(g(2*i + 1, 2*j + 1, t), g(2*i, 2*j + 1, t));
28+
}
29+
}
30+
}
31+
return uf.isConnected(g(1, 1, t), g(2*m - 1, 2*n - 1, t));
32+
}
33+
34+
public int g(int r, int c, int n) {
35+
return r*n + c;
36+
}
37+
}

0 commit comments

Comments
 (0)