POJ - 2311 Cutting Game sg函数 二维
Q - Cutting Game
两个人在玩游戏。游戏规则如下:准备一张分成W x H的格子的长方形纸张,参与游戏的两个人轮流沿着格子的边界线切割纸张,水平或者垂直的奖纸张切割成两个部分。切割了n次之后就得到了n+1张纸,每次都选择切得的某一张纸再次进行切割。首先切出只有一个格子的纸张(1 x 1的各自组成的纸张)的一方获胜。
Input
输入包含多组测试样例。每组测试样例包含两个整数W和H(2 <= W, H <= 200),分别表示纸张的长和宽。
Output
对于每个测试样例输出一行:如果先手必胜输出"WIN",否则输出 "LOSE"。
Sample Input
2 2 3 2 4 2
Sample Output
LOSE LOSE WIN
直接暴力
这题好像有歧义
每次都选择切得的某一张纸再次进行切割
是选 上次切的两张纸中的一个 还是 以前全部切得的纸中的
这道题是后者
注意让强制没有1的状态转移、
从2开始转移
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
const int maxn=1e5+10;
int a[maxn];
int sg[206][206];
int flag[1005];
int main()
{
int w,h;
memset(sg,0,sizeof(sg));
for(int i=2; i<=200; i++)
{
for(int j=2; j<=200;j++)
{
memset(flag,0,sizeof(flag));
for(int k=2; k<=j-2; k++)
{
flag[(sg[i][k]^sg[i][j-k])]++;
}
for(int k=2; k<=i-2; k++)
{
flag[(sg[k][j]^sg[i-k][j])]++;
}
for(int k=0; k<1000; k++)
{
if(!flag[k])
{
sg[i][j]=k;
break;
}
}
}
}
while(scanf("%d%d",&w,&h)!=EOF)
{
if(sg[w][h])
printf("WIN\n");
else if(sg[w][h]==0)
printf("LOSE\n");
}
}