Skip to content

Commit 457c013

Browse files
committed
feat: add solutions to lc problem: No.0913
No.0913.Cat and Mouse
1 parent 1aa286d commit 457c013

File tree

6 files changed

+749
-1
lines changed

6 files changed

+749
-1
lines changed

solution/0900-0999/0913.Cat and Mouse/README.md

+253-1
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,267 @@
6464
<!-- 这里可写当前语言的特殊实现逻辑 -->
6565

6666
```python
67-
67+
class Solution:
68+
def catMouseGame(self, graph: List[List[int]]) -> int:
69+
@lru_cache(None)
70+
def dfs(i, j, k):
71+
# 老鼠 / 猫 / 总步数
72+
if k >= 2 * len(graph):
73+
return 0 # 平局
74+
if i == 0:
75+
return 1 # 老鼠获胜
76+
if i == j:
77+
return 2 # 猫获胜
78+
if k % 2: # 轮到猫行动
79+
tie = False
80+
for next in graph[j]:
81+
if next == 0:
82+
continue
83+
x = dfs(i, next, k + 1)
84+
if x == 2:
85+
return 2
86+
if x == 0:
87+
# 继续寻找是否存在获胜的方案
88+
tie = True
89+
if tie:
90+
return 0
91+
return 1
92+
else: # 轮到老鼠行动
93+
tie = False
94+
for next in graph[i]:
95+
x = dfs(next, j, k + 1)
96+
if x == 1:
97+
return 1
98+
if x == 0:
99+
# 继续寻找是否存在获胜的方案
100+
tie = True
101+
if tie:
102+
return 0
103+
return 2
104+
105+
return dfs(1, 2, 0)
68106
```
69107

70108
### **Java**
71109

72110
<!-- 这里可写当前语言的特殊实现逻辑 -->
73111

74112
```java
113+
class Solution {
114+
private int[][][] memo;
115+
private int[][] graph;
116+
117+
public int catMouseGame(int[][] graph) {
118+
int n = graph.length;
119+
this.graph = graph;
120+
memo = new int[n][n][2 * n + 10];
121+
for (int i = 0; i < n; ++i) {
122+
for (int j = 0; j < n; ++j) {
123+
for (int k = 0; k < 2 * n + 10; ++k) {
124+
memo[i][j][k] = -1;
125+
}
126+
}
127+
}
128+
return dfs(1, 2, 0);
129+
}
130+
131+
private int dfs(int i, int j, int k) {
132+
// 老鼠 / 猫 / 总步数
133+
if (memo[i][j][k] != -1) {
134+
return memo[i][j][k];
135+
}
136+
if (k >= 2 * graph.length) {
137+
// 平局
138+
memo[i][j][k] = 0;
139+
} else if (i == 0) {
140+
// 老鼠获胜
141+
memo[i][j][k] = 1;
142+
} else if (i == j) {
143+
// 猫获胜
144+
memo[i][j][k] = 2;
145+
} else if (k % 2 == 1) {
146+
// 轮到猫行动
147+
boolean tie = false;
148+
boolean win = false;
149+
for (int next : graph[j]) {
150+
if (next == 0) {
151+
continue;
152+
}
153+
int x = dfs(i, next, k + 1);
154+
if (x == 2) {
155+
win = true;
156+
memo[i][j][k] = 2;
157+
break;
158+
}
159+
if (x == 0) {
160+
// 继续寻找是否存在获胜的方案
161+
tie = true;
162+
}
163+
}
164+
if (!win) {
165+
memo[i][j][k] = tie ? 0 : 1;
166+
}
167+
} else {
168+
// 轮到老鼠行动
169+
boolean tie = false;
170+
boolean win = false;
171+
for (int next : graph[i]) {
172+
int x = dfs(next, j, k + 1);
173+
if (x == 1) {
174+
win = true;
175+
memo[i][j][k] = 1;
176+
break;
177+
}
178+
if (x == 0) {
179+
// 继续寻找是否存在获胜的方案
180+
tie = true;
181+
}
182+
}
183+
if (!win) {
184+
memo[i][j][k] = tie ? 0 : 2;
185+
}
186+
}
187+
return memo[i][j][k];
188+
}
189+
}
190+
```
191+
192+
### **C++**
193+
194+
```cpp
195+
class Solution {
196+
public:
197+
vector<vector<vector<int>>> memo;
198+
vector<vector<int>> graph;
199+
200+
int catMouseGame(vector<vector<int>>& graph) {
201+
int n = graph.size();
202+
this->graph = graph;
203+
memo.resize(n, vector<vector<int>>(n, vector<int>(2 * n + 10)));
204+
for (int i = 0; i < memo.size(); ++i)
205+
for (int j = 0; j < memo[0].size(); ++j)
206+
for (int k = 0; k < memo[0][0].size(); ++k)
207+
memo[i][j][k] = -1;
208+
return dfs(1, 2, 0);
209+
}
210+
211+
int dfs(int i, int j, int k) {
212+
if (memo[i][j][k] != -1) return memo[i][j][k];
213+
if (k >= 2 * graph.size()) memo[i][j][k] = 0;
214+
else if (i == 0) memo[i][j][k] = 1;
215+
else if (i == j) memo[i][j][k] = 2;
216+
else if (k % 2)
217+
{
218+
bool tie = false, win = false;
219+
for (int next : graph[j])
220+
{
221+
if (next == 0) continue;
222+
int x = dfs(i, next, k + 1);
223+
if (x == 2)
224+
{
225+
win = true;
226+
memo[i][j][k] = 2;
227+
break;
228+
}
229+
if (x == 0) tie = true;
230+
}
231+
if (!win) memo[i][j][k] = tie ? 0 : 1;
232+
}
233+
else
234+
{
235+
bool tie = false, win = false;
236+
for (int next : graph[i])
237+
{
238+
int x = dfs(next, j, k + 1);
239+
if (x == 1)
240+
{
241+
win = true;
242+
memo[i][j][k] = 1;
243+
break;
244+
}
245+
if (x == 0) tie = true;
246+
}
247+
if (!win) memo[i][j][k] = tie ? 0 : 2;
248+
}
249+
return memo[i][j][k];
250+
}
251+
};
252+
```
75253
254+
### **Go**
255+
256+
```go
257+
func catMouseGame(graph [][]int) int {
258+
n := len(graph)
259+
memo := make([][][]int, n)
260+
for i := range memo {
261+
memo[i] = make([][]int, n)
262+
for j := range memo[i] {
263+
memo[i][j] = make([]int, 2*n+10)
264+
for k := range memo[i][j] {
265+
memo[i][j][k] = -1
266+
}
267+
}
268+
}
269+
var dfs func(i, j, k int) int
270+
dfs = func(i, j, k int) int {
271+
if memo[i][j][k] != -1 {
272+
return memo[i][j][k]
273+
}
274+
if k >= 2*len(graph) {
275+
memo[i][j][k] = 0
276+
} else if i == 0 {
277+
memo[i][j][k] = 1
278+
} else if i == j {
279+
memo[i][j][k] = 2
280+
} else if k%2 == 1 {
281+
tie, win := false, false
282+
for _, next := range graph[j] {
283+
if next == 0 {
284+
continue
285+
}
286+
x := dfs(i, next, k+1)
287+
if x == 2 {
288+
win = true
289+
memo[i][j][k] = 2
290+
break
291+
}
292+
if x == 0 {
293+
tie = true
294+
}
295+
}
296+
if !win {
297+
if tie {
298+
memo[i][j][k] = 0
299+
} else {
300+
memo[i][j][k] = 1
301+
}
302+
}
303+
} else {
304+
tie, win := false, false
305+
for _, next := range graph[i] {
306+
x := dfs(next, j, k+1)
307+
if x == 1 {
308+
win = true
309+
memo[i][j][k] = 1
310+
break
311+
}
312+
if x == 0 {
313+
tie = true
314+
}
315+
}
316+
if !win {
317+
if tie {
318+
memo[i][j][k] = 0
319+
} else {
320+
memo[i][j][k] = 2
321+
}
322+
}
323+
}
324+
return memo[i][j][k]
325+
}
326+
return dfs(1, 2, 0)
327+
}
76328
```
77329

78330
### **...**

0 commit comments

Comments
 (0)