题目大意: n×m n × m 的网格,两个玩家每轮将一个网格切成两半,先切到 1×1 1 × 1 的网格的人胜利。求先手是否有必胜策略。
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;
}