1. 程式人生 > >913. Cat and Mouse

913. Cat and Mouse

A game on an undirected graph is played by two players, Mouse and Cat, who alternate turns.

The graph is given as follows: graph[a] is a list of all nodes b such that ab is an edge of the graph.

Mouse starts at node 1 and goes first, Cat starts at node 2 and goes second, and there is a Hole at node 0.

During each player's turn, they must travel along one edge of the graph that meets where they are.  For example, if the Mouse is at node 1, it must travel to any node in graph[1].

Additionally, it is not allowed for the Cat to travel to the Hole (node 0.)

Then, the game can end in 3 ways:

  • If ever the Cat occupies the same node as the Mouse, the Cat wins.
  • If ever the Mouse reaches the Hole, the Mouse wins.
  • If ever a position is repeated (ie. the players are in the same position as a previous turn, and it is the same player's turn to move), the game is a draw.

Given a graph, and assuming both players play optimally, return 1 if the game is won by Mouse, 2

 if the game is won by Cat, and 0 if the game is a draw.

Example 1:

Input: [[2,5],[3],[0,4,5],[1,4,5],[2,3],[0,2,3]]
Output: 0
Explanation:
4---3---1
|   |
2---5
 \ /
  0

Note:

  1. 3 <= graph.length <= 50
  2. It is guaranteed that graph[1] is non-empty.
  3. It is guaranteed that graph[2] contains a non-zero element. 

思路:模擬一遍遊戲,

1. 注意返回值,如果你設定的返回是一個數,就照著一個數的思想去想

2. 在求某個狀態的時候,先把這個狀態設定為draw,這樣可以處理環的問題

class Solution(object):
    def catMouseGame(self, graph):
        """
        :type graph: List[List[int]]
        :rtype: int
        """
        mouse,cat={},{}
        
        def mouse_move(i,j):
            if (i,j) in mouse: return mouse[(i,j)]
            mouse[(i,j)]=0
            
            canDraw = False
            for t in graph[i]:
                if t==0:
                    mouse[(i,j)]=1
                    return 1
                if t==j: continue
                tmp = cat_move(t,j)
                if tmp==1:
                    mouse[(i,j)]=1
                    return 1
                if tmp==0: canDraw=True
            res = 0 if canDraw else 2
            mouse[(i,j)]=res
            return res
                
        def cat_move(i,j):
            if (i,j) in cat: return cat[(i,j)]
            cat[(i,j)]=0 # handle draw case
            
            canDraw = False
            for t in graph[i]:
                # case1
                if t==j:
                    cat[(i,j)]=2
                    return 2
                # case2
                if t==0: continue
                # case3
                tmp = mouse_move(i,t)
                if tmp==2:
                    cat[(i,j)]=2
                    return 2
                if tmp==0: canDraw=True
            res = 0 if canDraw else 1
            cat[(i,j)]=res
            return res
        
        return mouse_move(1,2)
        
        
s=Solution()
print(s.catMouseGame([[2,5],[3],[0,4,5],[1,4,5],[2,3],[0,2,3]]))