这又是一道博弈的题目,但是是我看了解题报告后才敲的。其中还看了Game Theory。。但是对于求SG函数的值还是存在很大的疑惑。求的是不包括所有子情况中大于0的最小值。。(感觉我说得好绕)。。。但是也就是遵循一个原则,就是当子情况中只要存在P-position(先手必败)那么该情况一定是个N-position(即先手必胜)。如果所有的子情况都是N-position那么它一定是P-position。然后用异或来完成就好。
这道题的思路完全是借用的别人的:
上代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int a[50000],b[210][210];
int f(int x,int y){
int i,j,k,temp;
if(x>y){
temp=x;
x=y;
y=temp;
}
if(b[x][y]!=-1)return b[x][y];
memset(a,0,sizeof(a));
for(i=2;i<=x/2;i++){
k=f(x-i,y)^f(i,y);
a[k]=1;
}
for(i=2;i<=y/2;i++){
k=f(x,i)^f(x,y-i);
a[k]=1;
}
for(i=0;a[i]==1;i++);
return b[x][y]=i;
}
main(){
int x,y;
memset(b,-1,sizeof(b));
while(scanf("%d%d",&x,&y)==2){
if(f(x,y)==0)
printf("LOSE\n");
else
printf("WIN\n");
}
}