四種博弈總結

Mr_Treeeee發表於2020-04-06

一.  巴什博奕(Bash Game):

1、  本遊戲是一個二人遊戲;
2、  有一堆石子一共有n個;
3、  兩人輪流進行;
4、  每走一步可以取走1…m個石子;
5、  最先取光石子的一方為勝;


POINT:

如果n能被(m+1)整除,後手贏,其他情況先手贏。

可以寫寫sg函式,就知道了。

        if(n%(m+1)==0)
            printf("second\n");
        else
            printf("first\n");


二.  威佐夫博弈(Wythoff Game):

有兩堆各若干的物品,兩人輪流從其中一堆取至少一件物品,至多不限,或從兩堆中同時取相同件物品,規定最後取完者勝利。

POINT:

兩堆物品數量是a<b。if(a==(sqrt(5)+1)/2*(b-a)) 後手贏  else 先手贏。ps.向下取整用floor

解釋:http://blog.csdn.net/y990041769/article/details/21694007

        if(floor((sqrt(5.0)+1)/2*(b-a))==a)
        {
            printf("second\n");
        }
        else printf("first\n");


三.  尼姆博弈(Nimm Game):

有任意堆物品,每堆物品的個數是任意的,雙方輪流從中取物品,每一次只能從一堆物品中取部分或全部物品,最少取一件,取到最後一件物品的人獲勝。

POINT:

兩種形態,1.取到最後一件物品的人獲勝。2.取到最後一件物品的人失敗(HDU 2509)。

1.把每堆的數量異或,為0則後手贏,否則先手贏。

2.分單堆和多堆討論。若多堆只有一個,則先手贏。若沒有多堆,則看單堆數量奇偶。若有多個多堆,異或為0則後手贏,反之先手贏。

解釋:http://acm.hdu.edu.cn/forum/read.php?fid=9&tid=10617


1.

int res=0;
for(int i=1;i<=n;i++)
{
    scanf("%d",&a[i]);
    res=res^a[i];
}
if(!res) printf("second\n");
else
{
    printf("first\n")
}
2.

http://blog.csdn.net/mr_treeeee/article/details/75136470

四.  斐波那契博弈:

有一堆物品,兩人輪流取物品,先手最少取一個,至多無上限,但不能把物品取完,之後每次取的物品數不能超過上一次取的物品數的二倍且至少為一件,取走最後一件物品的人獲勝。


POINT:

n為斐波那契數則後手贏,反之先手贏。

解釋:http://blog.csdn.net/acm_cxlove/article/details/7835016

相關文章