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!")