给出的边最小为2,所以当出现2* 2,2* 3,3* 2时为终止状态;将剪的两个纸片的sg进行异或值标记。 现在要是谁剪出1* 1的纸片就赢了。
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int maxx=1005;
int sg[505][505];
int a,b;
int SG(int n,int m){
if(sg[n][m]!=-1){
return sg[n][m];
}
int mex[maxx];
memset(mex,0,sizeof(mex));
for(int i=2;i<=n-i;i++){
mex[SG(i,m)^SG(n-i,m)]=1;
}
for(int i=2;i<=m-i;i++){
mex[SG(n,i)^SG(n,m-i)]=1;
}
for(int i=0;;i++){
if(mex[i]==0){
return sg[n][m]=i;
}
}
}
int main(){
memset(sg,-1,sizeof(sg));
while(scanf("%d %d",&a,&b)!=EOF){
int flag=SG(a,b);
if(flag==0){
cout<<"LOSE"<<endl;
}else{
cout<<"WIN"<<endl;
}
}
return 0;
}