求SG函数好题,关于这个还得好好练习练习
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=210;
int n,m,dp[maxn][maxn];
int grundy(int w,int h)
{
if(dp[w][h]!=-1)
return dp[w][h];
bool vis[maxn*2];
memset(vis,0,sizeof(vis));
for(int i=2;i<=w-i;i++)
vis[grundy(i,h)^grundy(w-i,h)]=1;
for(int i=2;i<=h-i;i++)
vis[grundy(w,i)^grundy(w,h-i)]=1;
int res=0;
while(vis[res])
res++;
return dp[w][h]=res;
}
int main()
{
memset(dp,-1,sizeof(dp));
while(scanf("%d%d",&n,&m)!=EOF)
{
if(grundy(n,m))
printf("WIN\n");
else
printf("LOSE\n");
}
return 0;
}