【POJ 2311】Cutting Game(SG函数)

题目链接:【POJ 2311】Cutting Game

题目大意: n × m 的网格,两个玩家每轮将一个网格切成两半,先切到 1 × 1 的网格的人胜利。求先手是否有必胜策略。

链接:SG函数详细讲解
链接:题目详解

SG函数的大坑到时候再填。先上代码:

#include <cstdio>
#include <cstring>
const int maxn = 205;
int dp[maxn][maxn], n, m;
int main() {
    bool vis[1 << 8];
    for (int i = 2; i <= 200; i++) {
        for (int j = 2; j <= 200; j++) {
            memset(vis, 0, sizeof(vis));
            for (int k = 2; k <= i - 2; k++) {
                vis[dp[k][j] ^ dp[i - k][j]] = 1;
            }
            for (int k = 2; k <= j - 2; k++) {
                vis[dp[i][k] ^ dp[i][j - k]] = 1;
            }
            for (int k = 0; k < 1 << 8; k++) {
                if (!vis[k]) {
                    dp[i][j] = k;
                    break;
                }
            }
        }
    }
    while (~scanf("%d %d", &n, &m) && ~n && ~m) {
        if (dp[n][m]) {
            puts("WIN");
        } else {
            puts("LOSE");
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42068627/article/details/80884866