@@ -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
66class 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