原题链接:POJ2311
解析:作为书上的例题,用来练手,思路懒得说,主要熟悉代码写法。
代码示例:
#include<cstring>
#include<cstdio>
const int maxn = 300;
int sg[maxn][maxn];
int vis[1000];
int get_sg(int n,int m){
if(n == 1 || m == 1) return sg[n][m] = 1;
if(sg[n][m] != -1) return sg[n][m];
memset(vis,0,sizeof vis);
for(int i = 2;i <= n/2;i++)
vis[get_sg(i,m)^get_sg(n-i,m)] = 1;
for(int i = 2;i <= m/2;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(~scanf("%d%d",&n,&m)){
if(get_sg(n,m)) puts("WIN");
else puts("LOSE");
}
return 0;
}