-
-
Notifications
You must be signed in to change notification settings - Fork 9k
/
Copy pathSolutioin.py
56 lines (53 loc) · 2.06 KB
/
Solutioin.py
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
HOLE, MOUSE_START, CAT_START = 0, 1, 2
MOUSE_TURN, CAT_TURN = 0, 1
MOUSE_WIN, CAT_WIN, TIE = 1, 2, 0
class Solution:
def catMouseGame(self, graph: List[List[int]]) -> int:
def get_prev_states(state):
m, c, t = state
pt = t ^ 1
pre = []
if pt == CAT_TURN:
for pc in graph[c]:
if pc != HOLE:
pre.append((m, pc, pt))
else:
for pm in graph[m]:
pre.append((pm, c, pt))
return pre
n = len(graph)
res = [[[0, 0] for _ in range(n)] for _ in range(n)]
degree = [[[0, 0] for _ in range(n)] for _ in range(n)]
for i in range(n):
for j in range(1, n):
degree[i][j][MOUSE_TURN] = len(graph[i])
degree[i][j][CAT_TURN] = len(graph[j])
for j in graph[HOLE]:
degree[i][j][CAT_TURN] -= 1
q = deque()
for j in range(1, n):
res[0][j][MOUSE_TURN] = res[0][j][CAT_TURN] = MOUSE_WIN
q.append((0, j, MOUSE_TURN))
q.append((0, j, CAT_TURN))
for i in range(1, n):
res[i][i][MOUSE_TURN] = res[i][i][CAT_TURN] = CAT_WIN
q.append((i, i, MOUSE_TURN))
q.append((i, i, CAT_TURN))
while q:
state = q.popleft()
t = res[state[0]][state[1]][state[2]]
for prev_state in get_prev_states(state):
pm, pc, pt = prev_state
if res[pm][pc][pt] == TIE:
win = (t == MOUSE_WIN and pt == MOUSE_TURN) or (
t == CAT_WIN and pt == CAT_TURN
)
if win:
res[pm][pc][pt] = t
q.append(prev_state)
else:
degree[pm][pc][pt] -= 1
if degree[pm][pc][pt] == 0:
res[pm][pc][pt] = t
q.append(prev_state)
return res[MOUSE_START][CAT_START][MOUSE_TURN]