猫鼠游戏 913. Cat and Mouse

这题大概可以难哭一众小姑娘。
反正我是觉得真的很难。
现在回想起来,这是一道图遍历的染色题 + game theory吧。
首先我们先定义我们的图。
我们的图和题中的图非常不一样。我们说的图遍历是遍历我们自己定义的图,不是题目中的图。
我们的图中的每一个点是老鼠的状态,猫的状态,和这时该谁先走。
千万不要被题中的图所迷惑

class State {
    int mouseLoc;
    int catLoc;
    int whosTurn;
}

然后这个问题就变成了从已经确定颜色的点出发遍历整张图的问题。
我感觉里面有环用DFS不好做。我看到有人用DFS做,可是我没理解。
还是BFS保险一点。
然后就是minMax或者game theory的问题。这个我的理解不是很好。先不写了,回头补上。
不过做到现在我感觉也没有那难了。图遍历问题而已。
follow up如果猫每次可以走两步, 怎么做。那就把parent函数改一下吧。
看一下代码

class Solution {
    int MOUSE = 1, CAT = 2, DRAW = 0;
    public int catMouseGame(int[][] graph) {
        int N = graph.length;
        int[][][] color = new int[N][N][3]; //mouse location, cat location, who play first
        int[][][] degrees = new int[N][N][3]; 
        buildDegreeMap(graph, degrees);
        
        //MOUSE at 0 has color of MOUSE; MOUSE CAT AT SAME PLACE HAS color of CAT except when at 0;
        Queue queue = new LinkedList<>();
        for (int i = 1; i < N; i++) {
            color[i][i][MOUSE] = CAT;
            queue.offer(new State(i, i, MOUSE));
            color[i][i][CAT] = CAT;
            queue.offer(new State(i, i, CAT));
        }
        for (int i = 0; i < N; i++) {
            color[0][i][MOUSE] = MOUSE;
            color[0][i][CAT] = MOUSE;
            queue.offer(new State(0, i, MOUSE));
            queue.offer(new State (0, i, CAT));
        }
        
        while(!queue.isEmpty()) {
            State state = queue.poll();
            int m = state.mouseLoc, c = state.catLoc, w = state.whosTurn;
            for (State parentState : getParentState(state, graph)) {
                int pm = parentState.mouseLoc, pc = parentState.catLoc, pw = parentState.whosTurn;
                if (color[pm][pc][pw] != 0) continue;
                
                if (color[m][c][w] == pw) {
                    color[pm][pc][pw] = pw;
                    queue.offer(new State(pm, pc, pw));
                } else {
                    degrees[pm][pc][pw]--;
                    if (degrees[pm][pc][pw] == 0) {
                        color[pm][pc][pw] = 3 - pw;
                        queue.offer(new State(pm, pc, pw));
                    }
                }
            }
        }
        return color[1][2][MOUSE];
    }
    
    public void buildDegreeMap(int[][] graph,  int[][][] degrees) {
        for (int i = 0; i < graph.length; i++) {
            for (int j = 0; j < graph.length; j++) {
                
                degrees[i][j][1] = graph[i].length;
                degrees[i][j][2] = graph[j].length;
                
                for (int prev : graph[j]) {
                    if (prev == 0) {
                        degrees[i][j][2]--;
                        break;
                    }
                }
            }
        }
    }
    public List getParentState(State state, int[][] graph) {
        List ans = new ArrayList<>();
        if (state.whosTurn == MOUSE) {
            for (int prev : graph[state.catLoc]) {
                if (prev != 0) ans.add(new State(state.mouseLoc, prev, CAT));
            }
        } else {
            for (int prev : graph[state.mouseLoc]) {
                ans.add(new State(prev, state.catLoc, MOUSE));
            }
        }
        return ans;
    }
}
class State {
    int mouseLoc;
    int catLoc;
    int whosTurn;
    public State(int m, int c, int w) {
        mouseLoc = m;
        catLoc = c;
        whosTurn = w;
    }
}

你可能感兴趣的:(猫鼠游戏 913. Cat and Mouse)