博弈论

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是斐波那契数,那么先手必败。

威佐夫博弈

取走一堆中任意个筹码,或从两堆中取走相同数目的筹码。取完所有筹码的一方获胜。

  • 当满足\frac{1+\sqrt{5}}{2}\cdot (max(n,m) - min(n,m)) == min(n,m),先手必败。

巴什博奕

只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。

  • 设n = (m + 1) * r + x。如果x = 0,那么先手必败;否则先手必胜。
posted @ 2019-10-09 22:18  月光下の魔术师  阅读(13)  评论(0)    收藏  举报