class Solution {
static int N = 55;
static int[][][] f = new int[2 * N * N][N][N];
int[][] g;
int n;
public int catMouseGame(int[][] graph) {
g = graph;
n = g.length;
for (int k = 0; k < 2 * n * n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
f[k][i][j] = -1;
}
}
}
return dfs(0, 1, 2);
}
// 0:draw / 1:mouse / 2:cat
int dfs(int k, int a, int b) {
int ans = f[k][a][b];
if (a == 0) ans = 1;
else if (a == b) ans = 2;
else if (k >= 2 * n * n) ans = 0;
else if (ans == -1) {
if (k % 2 == 0) { // mouse
boolean win = false, draw = false;
for (int ne : g[a]) {
int t = dfs(k + 1, ne, b);
if (t == 1) win = true;
else if (t == 0) draw = true;
if (win) break;
}
if (win) ans = 1;
else if (draw) ans = 0;
else ans = 2;
} else { // cat
boolean win = false, draw = false;
for (int ne : g[b]) {
if (ne == 0) continue;
int t = dfs(k + 1, a, ne);
if (t == 2) win = true;
else if (t == 0) draw = true;
if (win) break;
}
if (win) ans = 2;
else if (draw) ans = 0;
else ans = 1;
}
}
f[k][a][b] = ans;
return ans;
}
}
力扣猫和老鼠
最新推荐文章于 2022-05-10 11:32:05 发布