#include<iostream> #include<cstdio> #include<cstring> using namespace std; int sg[205][205]; bool vis[300]; int get_sg(int n,int m) { if(sg[n][m]!=-1) return sg[n][m]; for(int i=2;i<=n-i;i++) vis[get_sg(i,m)^get_sg(n-i,m)]=1; for(int i=2;i<=m-i;i++) vis[get_sg(n,i)^get_sg(n,m-i)]=1; for(int i=0; ;i++) if(!vis[i]) return sg[n][m]=i; } int main() { int n,m; memset(sg,-1,sizeof(sg));//放while外面,也相当于记忆化了 数据后面可以用 sg[2][2]=sg[3][2]=sg[2][3]=0; while(~scanf("%d%d",&n,&m)) { memset(vis,0,sizeof(vis)); // printf("%d\n",get_sg(n,m)); if(get_sg(n,m)) printf("WIN\n"); else printf("LOSE\n"); } return 0; }
原文:http://www.cnblogs.com/atmacmer/p/5244034.html