Q - Cutting Game

POJ - 2311

两个人在玩游戏。游戏规则如下:准备一张分成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");
    }

}