全局计算 sg 的数组 is,有可能在计算当前层时清理掉父级标记。
int dfs(int w, int h) {
if (vis[w][h]) return sg[w][h];
vis[w][h] = true;
if (w == 2 && h == 2) return sg[w][h] = 0;
for (int i = 2; i <= w - 2; ++i) is[dfs(i, h) ^ dfs(w - i, h)] = true;
for (int i = 2; i <= h - 2; ++i) is[dfs(w, i) ^ dfs(w, h - i)] = true;
while (is[sg[w][h]] == 1) sg[w][h]++;
for (int i = 2; i <= w - 2; ++i) is[dfs(i, h) ^ dfs(w - i, h)] = false;
for (int i = 2; i <= h - 2; ++i) is[dfs(w, i) ^ dfs(w, h - i)] = false;
return sg[w][h];
}