博弈论
SG函数
//f[N]:可改变当前状态的方式,N为方式的种类,f[N]要在getSG之前先预处理
//SG[]:0~n的SG函数值
//S[]:为x后继状态的集合
int f[N],SG[MAXN],S[MAXN];
void getSG(int n){
int i,j;
memset(SG,0,sizeof(SG));
//因为SG[0]始终等于0,所以i从1开始
for(i = 1; i <= n; i++){
//每一次都要将上一状态 的 后继集合 重置
memset(S,0,sizeof(S));
for(j = 0; f[j] <= i && j <= N; j++)
S[SG[i-f[j]]] = 1; //将后继状态的SG函数值进行标记
for(j = 0;;j++) if(!S[j]){ //查询当前后继状态SG值中最小的非零值
SG[i] = j;
break;
}
}
}
NIM博弈
每次选择一堆取任意多个,最后不能取的输
- 异或和为0,先手必败;否则先手必胜
ANTI-NIM博弈
每次选择一堆取任意多个,最后不能取赢
- 石头堆全部是1,那么异或和为0,先手必胜。
- 存在一个大于1的堆,如果异或和为1,则先手必胜。
斐波那契博弈
一堆石子有n个,两人轮流取,先取者第1次可以取任意多个,但不能全部取完,以后每次取的石子数不能超过上次取子数的
2倍。取完者胜
- 如果n是斐波那契数,那么先手必败。
威佐夫博弈
取走一堆中任意个筹码,或从两堆中取走相同数目的筹码。取完所有筹码的一方获胜。
- 当满足
,先手必败。
巴什博奕
只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。
- 设n = (m + 1) * r + x。如果x = 0,那么先手必败;否则先手必胜。

浙公网安备 33010602011771号