博弈即玄学啊 (除了nim和二分图博弈什么都不会
算是学了下SG函数吧
这个东西是针对有向图游戏的,相当于把一个局面看作一个点,到达下个局面相当于建一条边
必胜态SG值为0
那么对于一个点,他的SG值就是所有能够到达他的点的SG值的mex
对于有向图游戏的和(也就是有多个有向图同时进行游戏),那么就把那些局面的SG值xor起来再求mex
poj2311 这个可以说是很经典了,首先带1的都是必胜态,2 3,3 2,2 2,都是必败态,对于一个状态,就枚举每种切法,然后两边的SG值异或起来整体求mex即可。
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; int sg[210][210]; int v[41000]; int main() { int ti=0; sg[2][2]=0;sg[2][3]=0;sg[3][2]=0; for(int i=2;i<=200;i++) for(int j=2;j<=200;j++) { if((i==2&&j==2)||(i==2&&j==3)||(i==3&&j==2))continue; ti++; for(int k=2;k<=i/2;k++)v[sg[k][j]^sg[i-k][j]]=ti; for(int k=2;k<=j/2;k++)v[sg[i][k]^sg[i][j-k]]=ti; for(int k=0;;k++) if(v[k]!=ti){sg[i][j]=k;break;} } int n,m; while(scanf("%d%d",&n,&m)!=EOF) { if(sg[n][m]==0)printf("LOSE\n"); else printf("WIN\n"); } return 0; }