美文网首页
猫和老鼠

猫和老鼠

作者: xialu | 来源:发表于2022-01-04 23:09 被阅读0次

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/cat-and-mouse

题目描述:

两位玩家分别扮演猫和老鼠,在一张 无向 图上进行游戏,两人轮流行动。
图的形式是:graph[a] 是一个列表,由满足 ab 是图中的一条边的所有节点 b 组成。
老鼠从节点 1 开始,第一个出发;猫从节点 2 开始,第二个出发。在节点 0 处有一个洞。
在每个玩家的行动中,他们 必须 沿着图中与所在当前位置连通的一条边移动。例如,如果老鼠在节点 1 ,那么它必须移动到 graph[1] 中的任一节点。
此外,猫无法移动到洞中(节点 0)。
然后,游戏在出现以下三种情形之一时结束:
如果猫和老鼠出现在同一个节点,猫获胜。
如果老鼠到达洞中,老鼠获胜。
如果某一位置重复出现(即,玩家的位置和移动顺序都与上一次行动相同),游戏平局。
给你一张图 graph ,并假设两位玩家都都以最佳状态参与游戏:
如果老鼠获胜,则返回 1;
如果猫获胜,则返回 2;
如果平局,则返回 0 。

示例 1:

输入:graph = [[2,5],[3],[0,4,5],[1,4,5],[2,3],[0,2,3]]
输出:0

示例 2:

输入:graph = [[1,3],[0],[3],[0,2]]
输出:1

思路:

没看明白...:https://leetcode-cn.com/problems/cat-and-mouse/solution/gong-shui-san-xie-dong-tai-gui-hua-yun-y-0bx1/

代码实现:
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;
    }
}

相关文章

  • 一日一画(179)

    ——猫和老鼠。

  • 猫和老鼠

    猫和老鼠 很久以前,玉皇大帝要举行十二生肖的报名,动物们听了,都纷纷早去报名。那时猫和老鼠还是好朋友,猫和老鼠约定...

  • 2020-02-08

    晚上的时候,孩子到爸爸旁边说,要看猫和老鼠。爸爸语气不好说,猫和老鼠睡觉了。孩子怯声声的说,爸爸那等一再看猫和老鼠...

  • 猫和老鼠猫皇秘诀

    上期我们说了猫和老鼠鼠皇秘诀,这期我们就来说说猫和老鼠,猫皇秘诀,首先你要想成为猫和老鼠猫皇,那必须知道以下几点 ...

  • 2018-10-26

    看猫和老鼠,cad,会计

  • 临摹1

    马克杯 猫和老鼠

  • 这些属于90后的动漫,你都看过吗?

    猫和老鼠 不用多说,各地方言版本几乎都有。《猫和老鼠》(Tom and Jerry)是米高梅电影公司于1939年制...

  • 猫和老鼠

    在很久很久很久以前,猫和老鼠还都是好朋友。 那时候,猫是负责看粮仓的,很老实。老鼠则是个游手好闲的家伙。一天,老鼠...

  • 猫和老鼠

    周末的早上,小猫正准备睡觉 ,这时它发现一只小老鼠在厨房里偷吃东西。小猫悄悄走过去,但聪明的小老鼠很快发...

  • 猫和老鼠

    在家的时候,和儿子就象猫和老鼠.他刚开始有Q的时候,好友不多,所以很开心的把我加为他的好友.一不小心,还被他加入了...

网友评论

      本文标题:猫和老鼠

      本文链接:https://www.haomeiwen.com/subject/frnccrtx.html