This repository was archived by the owner on Sep 20, 2023. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 164
/
Copy pathcat-and-mouse.go
executable file
·79 lines (67 loc) · 1.72 KB
/
cat-and-mouse.go
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
package problem0913
// ref: https://leetcode.com/problems/cat-and-mouse/discuss/176177/Most-of-the-DFS-solutions-are-WRONG-check-this-case
func catMouseGame(graph [][]int) int {
n := len(graph)
colors := [50][50][2]int{}
outdegree := [50][50][2]int{}
for i := 0; i < n; i++ { // cat
for j := 0; j < n; j++ { // mouse
outdegree[i][j][0] = len(graph[j])
outdegree[i][j][1] = len(graph[i])
for _, k := range graph[i] {
if k == 0 {
outdegree[i][j][1]--
break
}
}
}
}
queue := make([][4]int, 0, n)
colorizeAndPush := func(cat, mouse, mouseMove, color int) {
colors[cat][mouse][mouseMove] = color
queue = append(queue, [4]int{cat, mouse, mouseMove, color})
}
for k := 1; k < n; k++ {
for m := 0; m < 2; m++ {
colorizeAndPush(k, 0, m, 1)
colorizeAndPush(k, k, m, 2)
}
}
var cur [4]int
for len(queue) > 0 {
cur, queue = queue[0], queue[1:]
cat, mouse, mouseMove, color := cur[0], cur[1], cur[2], cur[3]
if cat == 2 &&
mouse == 1 &&
mouseMove == 0 {
return color
}
prevMouseMove := 1 - mouseMove
animal := mouse
if prevMouseMove == 1 {
animal = cat
}
for _, prev := range graph[animal] {
prevCat := cat
prevMouse := prev
if prevMouseMove == 1 {
prevCat = prev
prevMouse = mouse
}
if prevCat == 0 {
continue
}
if colors[prevCat][prevMouse][prevMouseMove] > 0 {
continue
}
outdegree[prevCat][prevMouse][prevMouseMove]--
if (prevMouseMove == 1 && color == 2) ||
(prevMouseMove == 0 && color == 1) ||
(outdegree[prevCat][prevMouse][prevMouseMove] == 0) {
colors[prevCat][prevMouse][prevMouseMove] = color
queue = append(queue, [4]int{prevCat, prevMouse, prevMouseMove, color})
}
}
}
return colors[2][1][0]
}