首页 > 其他分享 >【每日一题】LeetCode 913.猫和老鼠(hard题)

【每日一题】LeetCode 913.猫和老鼠(hard题)

时间:2023-06-07 14:03:17浏览次数:64  
标签:cnt return hard cat nx 猫和老鼠 dic mouse LeetCode


题目

两位玩家分别扮演猫和老鼠,在一张 无向 图上进行游戏,两人轮流行动。

图的形式是:graph[a] 是一个列表,由满足 ab 是图中的一条边的所有节点 b 组成。

老鼠从节点 1 开始,第一个出发;猫从节点 2 开始,第二个出发。在节点 0 处有一个洞。

在每个玩家的行动中,他们 必须 沿着图中与所在当前位置连通的一条边移动。例如,如果老鼠在节点 1 ,那么它必须移动到 graph[1] 中的任一节点。

此外,猫无法移动到洞中(节点 0)。

然后,游戏在出现以下三种情形之一时结束:

如果猫和老鼠出现在同一个节点,猫获胜。
如果老鼠到达洞中,老鼠获胜。
如果某一位置重复出现(即,玩家的位置和移动顺序都与上一次行动相同),游戏平局。
给你一张图 graph ,并假设两位玩家都都以最佳状态参与游戏:

如果老鼠获胜,则返回 1;
如果猫获胜,则返回 2;
如果平局,则返回 0 。

示例

【每日一题】LeetCode 913.猫和老鼠(hard题)_List

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

代码

class Solution:
    def catMouseGame(self, graph: List[List[int]]) -> int:
        dic={}
        n=len(graph)
        def dp(cat, mouse, cnt):
            if (cat, mouse, cnt) in dic:
                return dic[(cat, mouse, cnt)]
            if cnt>2*n:
                dic[(cat, mouse, cnt)]=0
                return 0
            flag=False
            if cnt%2==0:
                for nx in graph[mouse]:
                    if nx==cat:
                        continue
                    if nx==0:
                        dic[(cat, mouse, cnt)]=1
                        return 1
                    if dp(cat,nx,cnt+1)==1:
                        dic[(cat,mouse,cnt)]=1
                        return 1
                    elif dp(cat, nx, cnt+1)==0:
                        flag=True
                if flag:
                    dic[(cat, mouse, cnt)]=0
                    return 0
                dic[(cat, mouse, cnt)]=2
                return 2
            else:
                for nx in graph[cat]:
                    if nx==mouse:
                        dic[(cat, mouse, cnt)]=2
                        return 2
                    if nx==0:
                        continue
                    if dp(nx, mouse, cnt+1)==0:
                        flag=True
                    elif dp(nx, mouse, cnt+1)==2:
                        dic[(cat, mouse, cnt)]=2
                        return 2
                if flag:
                    dic[(cat, mouse, cnt)]=0
                    return 0
                dic[(cat,mouse,cnt)]=1
                return 1
        return dp(2,1,0)


标签:cnt,return,hard,cat,nx,猫和老鼠,dic,mouse,LeetCode
From: https://blog.51cto.com/u_15567308/6431270

相关文章

  • LeetCode 481.神奇字符串
    LeetCode481.神奇字符串本题目应该说难在读题,根据题目描述的意思,s作为一个神奇字符串,他的每一组数都是根据前面的数去判定的,以开头的122之后为例,122之的末尾为2,而s的规则是1和2交替出现,所以后面应当跟着"1",而这一组"1"的数量则由其前面的"2"来决定,所以这一组有两个"1",同理,在这后面......
  • LeetCode 9.回文数
    LeetCode9.回文数思路分两种情况。如果值为负数,则当前数肯定不是回文数如果值为正数,则将其数值反转后与原数值比较,如果相同则是回文数代码classSolution{publicbooleanisPalindrome(intx){if(x<0)returnfalse;inttmp=0,num=x;while(num......
  • LeetCode 915.分割数组
    LeetCode915.分割数组思路模拟题,两遍遍历,因为要保证左侧区间尽可能小,所以就要找到最左面的适合的点,所以第一遍先从最右边开始记录前缀最小的数,之后再从左往右遍历一遍记录当前最大的前缀,同时将当前最大前缀与下一位的最小前缀比较,如果小于下一位的最小前缀则直接输出即可代码class......
  • LeetCode 934.最短的桥
    LeetCode934.最短的桥题目限制了岛的数量肯定为2,所以我们只需要找到两个岛即可,首先通过遍历每一个坐标找到一个岛的点(值为1),接着以这个点开始DFS,找到该岛上所有的点,并将值设为-1,然后以这些点为基础集合,再进行BFS,当找到第一个值为1的点时,BFS的层数就是需要翻转的数目classSolution......
  • LeetCode 907.子数组的最小值之和
    LeetCode907.子数组的最小值之和本题由于每一项都需要遍历到,所以我们要计算所有可能的排列组合情况,所以这道题我们应该从每个元素分别出发,构建单调栈,找到每个元素左边和右边第一个比他小的元素,在这个区间范围内,我们可以断定任何一个子区间得到的最小值都是当前选定这个元素,所以最......
  • 【LeetCode】11月每日一题刷题记录
    575.分糖果classSolution{public:intdistributeCandies(vector<int>&candyType){unordered_set<int>S;for(autoc:candyType)S.insert(c);returnmin(candyType.size()/2,S.size());}};237.删除链表中的节点由于是单链表......
  • LeetCode 862.和至少为k的最短子数组
    LeetCode862.和至少为k的最短子数组本题前缀和队列并不单调,所以应该算变种单调队列,在计算出单调队列以后还要进行进一步优化,即在如下条件如果我们找到当前的s[i]满足条件,则说明之后选取的s[i]不管是多少,均没有当前s[i]距离s[j]近,所以在此以后的值均可以丢弃,同理,s[j]之前的值也是......
  • LeetCode 388.文件的最长绝对路径
    题目链接思路针对文件路径的特征,一个文件中一定包含.分隔符,以此为依据可以判定当前字符串是否是一个文件,文件系统是一个树形结构的角度来看的话,题中给定的字符串实际上是以一个树形结构前序遍历的序列,连续的\t表示出了当前的深度,而相邻的节点之间以\n进行分割。假设当前的路径为x/......
  • CF1559D2 Mocha and Diana (Hard Version) 题解
    Luogu|Codeforces题意给定两个森林\(A\)和\(B\),均有编号\(1\)到\(n\)的节点,边数分别为\(m_1,m_2\)。现在进行加边操作,但是有两个要求:如果在第一个森林加一条\((u,v)\)的边,第二个森林也要进行同样的操作。反之同理。加边后两个森林依旧是森林。一棵树也是森林。......
  • #yyds干货盘点# LeetCode程序员面试金典:二叉树的右视图
    1.简述:给定一个二叉树的根节点root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例1:输入: [1,2,3,null,5,null,4]输出: [1,3,4]示例2:输入: [1,null,3]输出: [1,3]示例3:输入: []输出: []2.代码实现:classSolution{publicList<I......