Skip to content

Commit 8543d36

Browse files
committed
Update Solution.kt
1 parent ae42272 commit 8543d36

File tree

1 file changed

+34
-17
lines changed
  • src/main/kotlin/g1001_1100/s1036_escape_a_large_maze

1 file changed

+34
-17
lines changed

src/main/kotlin/g1001_1100/s1036_escape_a_large_maze/Solution.kt

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,49 +4,66 @@ package g1001_1100.s1036_escape_a_large_maze
44
// #2023_05_25_Time_387_ms_(100.00%)_Space_94.1_MB_(100.00%)
55

66
class Solution {
7+
private val MAX_COORD = 999999
8+
private val LARGE_NUMBER = 1000000
9+
710
fun isEscapePossible(blocked: Array<IntArray>, source: IntArray, target: IntArray): Boolean {
811
if (blocked.isEmpty()) {
912
return true
1013
}
1114

12-
val blocks = mutableSetOf<Int>()
15+
val blocks = HashSet<Int>()
1316
for (b in blocked) {
14-
if (target[0] * 1_000_000 + target[1] != b[0] * 1_000_000 + b[1]) {
15-
blocks.add(b[0] * 1_000_000 + b[1])
16-
}
17+
blocks.add(b[0] * LARGE_NUMBER + b[1])
1718
}
1819

19-
return dfs(blocks, source, source[0], source[1], mutableSetOf(), target) &&
20-
dfs(blocks, target, target[0], target[1], mutableSetOf(), source)
20+
return dfs(blocks, source, target, HashSet()) &&
21+
dfs(blocks, target, source, HashSet())
2122
}
2223

2324
private fun dfs(
2425
blocks: Set<Int>,
2526
start: IntArray,
26-
i: Int,
27-
j: Int,
28-
visited: MutableSet<Int>,
2927
target: IntArray,
28+
visited: HashSet<Int>,
3029
): Boolean {
31-
if (i < 0 || j < 0 || i > 999_999 || j > 999_999) {
30+
val i = start[0]
31+
val j = start[1]
32+
val hash = i * LARGE_NUMBER + j
33+
34+
if (i < 0 || j < 0 || i > MAX_COORD || j > MAX_COORD || blocks.contains(hash)) {
3235
return false
3336
}
34-
val pos = i * 1_000_000 + j
35-
if (blocks.contains(pos) || visited.contains(pos)) {
37+
38+
if (visited.contains(hash)) {
3639
return false
3740
}
41+
3842
if (i == target[0] && j == target[1]) {
3943
return true
4044
}
4145

42-
visited.add(pos)
46+
visited.add(hash)
47+
4348
if (visited.size > blocks.size * (blocks.size + 1)) {
4449
return true
4550
}
4651

47-
return dfs(blocks, start, i + 1, j, visited, target) ||
48-
dfs(blocks, start, i - 1, j, visited, target) ||
49-
dfs(blocks, start, i, j + 1, visited, target) ||
50-
dfs(blocks, start, i, j - 1, visited, target)
52+
val directions = listOf(
53+
intArrayOf(1, 0),
54+
intArrayOf(-1, 0),
55+
intArrayOf(0, 1),
56+
intArrayOf(0, -1),
57+
)
58+
59+
for (dir in directions) {
60+
val nextI = i + dir[0]
61+
val nextJ = j + dir[1]
62+
if (dfs(blocks, intArrayOf(nextI, nextJ), target, visited)) {
63+
return true
64+
}
65+
}
66+
67+
return false
5168
}
5269
}

0 commit comments

Comments
 (0)