POJ2311

这又是一道博弈的题目,但是是我看了解题报告后才敲的。其中还看了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");
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值