-
Notifications
You must be signed in to change notification settings - Fork 229
/
Copy path1654-minimum-jumps-to-reach-home.js
87 lines (83 loc) · 2.07 KB
/
1654-minimum-jumps-to-reach-home.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/**
* @param {number[]} forbidden
* @param {number} a
* @param {number} b
* @param {number} x
* @return {number}
*/
const minimumJumps = function (forbidden, a, b, x) {
const bad = new Set()
const set = new Set()
for (let i of forbidden) {
bad.add(i)
}
let q = []
q.push([0, 0, 0])
set.add('0,0')
while (q.length) {
const tmp = []
const size = q.length
for(let i = 0; i < size; i++) {
const [pos, level, state] = q[i]
if (pos === x) return level
if (state >= 0) {
if (pos <= 4000 && !set.has(pos + a + ',0') && !bad.has(pos + a)) {
set.add(pos + a + ',0')
tmp.push([pos + a, level + 1, 0])
}
if (!set.has(pos - b + ',-1') && !bad.has(pos - b) && pos - b >= 0) {
set.add(pos - b + ',-1')
tmp.push([pos - b, level + 1, -1])
}
} else if (state < 0) {
if (pos <= 4000 && !set.has(pos + a + ',0') && !bad.has(pos + a)) {
set.add(pos + a + ',0')
tmp.push([pos + a, level + 1, 0])
}
}
}
q = tmp
}
return -1
}
// another
/**
* @param {number[]} forbidden
* @param {number} a
* @param {number} b
* @param {number} x
* @return {number}
*/
const minimumJumps = function (forbidden, a, b, x) {
const bad = new Set()
const set = new Set()
for (let i of forbidden) {
bad.add(i)
}
const q = []
q.push([0, 0, 0])
set.add('0,0')
while (q.length) {
const pair = q.shift()
let pos = pair[0],
level = pair[1],
state = pair[2]
if (pos == x) return level
if (state >= 0) {
if (pos <= 4000 && !set.has(pos + a + ',0') && !bad.has(pos + a)) {
set.add(pos + a + ',0')
q.push([pos + a, level + 1, 0])
}
if (!set.has(pos - b + ',-1') && !bad.has(pos - b) && pos - b >= 0) {
set.add(pos - b + ',-1')
q.push([pos - b, level + 1, -1])
}
} else if (state < 0) {
if (pos <= 4000 && !set.has(pos + a + ',0') && !bad.has(pos + a)) {
set.add(pos + a + ',0')
q.push([pos + a, level + 1, 0])
}
}
}
return -1
}