LeetCode 913

LeetCode 913

咋一看这个题目还是比较难的,没有什么太好的思路。先去考虑数学的方法上,看看是否可能解,感觉想不清楚。每次老鼠或者猫的移动都需要考虑对方的move,有点像下棋,没有能想出一个最优的移动方法。
改用CS方法的思路,给的是图,那么总是还是搜索,那么BFS还是DFS?什么时候i是搜索结束? 不知道最优的办法,那么就只好把每种可能都尝试一次。

从题目中我们知道,如果老鼠进了0,就是赢了,如果同时落入一个点,那么猫赢了。如果进入重复,那么和了。考虑用DFS,如果图都走了一遍了,还没有被抓到,那么就不可能被抓到了,也可以作为一个结束。剩下的我们暴力破解法,
老鼠先走,尝试所有可能的途径,如果有一种方式是可以赢的,那就是他选择的路径,那么就可以判定为赢,
如果所有的途径都输了,那么就是输,否则是和。
论到猫走的时候,
尝试所有的可能,只要有一钟可能能抓到,那么就是正确的选择,可以判定猫赢
如果所有的路径都抓不到,那么就是输,否则是和。

所以暴力的代码还是比较简单的:

class Solution:    
      def catMouseGame(self, graph: List[List[int]]) -> int:
        def search(t, x, y):
            if t == len(graph) * 2: return 0
            if x == y: return 2 # cat win
            if x == 0: return 1 # mouse win

            if (t%2 == 0): #mouse turn
                #if any next step mouse win, it is win
                if any(search(t+1, x_nxt, y) == 1 for x_nxt in graph[x]): return 1
                #if all step cat win, it means cat win
                if all(search(t+1, x_nxt, y) == 2 for x_nxt in graph[x]): return 2
                return 0
            else:
                #if any next step cat win, it is win
                if any(search(t+1, x, y_nxt) == 2 for y_nxt in graph[y] if y_nxt != 0): return 2
                #if all step mouse win, it meanse mouse win
                if all(search(t+1, x, y_nxt) == 1 for y_nxt in graph[y] if y_nxt != 0): return 1
                return 0
        return search(0, 1, 2)


sln = Solution()

assert(sln.catMouseGame( [[2,5],[3],[0,4,5],[1,4,5],[2,3],[0,2,3]]) == 0)

print("913: All cases passed, great!")

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值