题目 猫和老鼠:https://leetcode-cn.com/problems/cat-and-mouse/submissions/
极大极小值,有深度搜索的感觉在。
每次新赋值都是要考虑当前状态是极大值还是极小值,然后根据这个状态再向上更新值。
这道题,维护两个数组,一个是当前节点可走节点数,一个是当前节点的胜负状态。
一开始先初始化这两个数组,将可走节点数取该节点线条数,如果是猫就减去一条0的线路。
胜负状态就初始化老鼠0,猫任意,老鼠赢 和 老鼠和猫同一点,猫赢 这两种状态点,其他节点通过后期遍历赋值。
遍历取到的状态点
同时每个状态点都要将能达到它的父节点给取出
遍历这些父节点,将没有状态的点进行判断赋值。
最后跑完的整个胜负数组的状态就是 老鼠起点, 猫起点, 胜负状态 的一个数组。
class Solution { public int catMouseGame(int[][] graph) { int N = graph.length; final int DRAW = 0, MOUSE = 1, CAT = 2; int[][][] degree = new int[50][50][3]; int[][][] color = new int[50][50][3]; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { degree[i][j][1] = graph[i].length; degree[i][j][2] = graph[j].length; for (int m: graph[j]) { if (m == 0) { degree[i][j][2]--; break; } } } } Queue<int[]> queue = new LinkedList<>(); for (int i = 0; i < N; i++) { for (int j = 1; j <=2; j++) { color[0][i][j] = MOUSE; queue.add(new int[]{0, i, j, MOUSE}); if (i > 0) { color[i][i][j] = CAT; queue.add(new int[]{i, i, j, CAT}); } } } while(!queue.isEmpty()) { int[] node = queue.remove(); int i = node[0], j = node[1], t = node[2], c = node[3]; for (int[] parent: getParent(graph, i, j, t)) { int i2 = parent[0], j2 = parent[1], t2 = parent[2]; if (color[i2][j2][t2] == DRAW) { if (t2 == c) { color[i2][j2][t2] = c; queue.add(new int[]{i2, j2, t2, c}); } else { degree[i2][j2][t2]--; if (degree[i2][j2][t2] == 0) { color[i2][j2][t2] = 3 - t2; queue.add(new int[]{i2, j2, t2, 3 - t2}); } } } } } return color[1][2][1]; } private List<int[]> getParent(int[][] graph, int i, int j, int t) { List<int[]> list = new LinkedList(); if (t == 2) { for (int m : graph[i]) { list.add(new int[]{m, j, 3-t}); } } else { for (int c : graph[j]) { if (c > 0) { list.add(new int[]{i, c, 3-t}); } } } return list; } }