威佐夫博奕
模型:
有兩堆石子,石子數目分別為n和m,現在兩個人輪流從兩堆石子中取石子,每人每次取石子時可以從一堆石子中拿走若干個,也可以從兩堆中取相同數量的石子,取完最後一堆石子的人贏。
這種情況有些複雜,先用(m,n)表示兩堆石子的數目,並稱其為局勢,如果兩人中某人面對(0,0)的局勢,則他已經輸了,把這種局勢稱為奇異局勢(即輸),按照n,m的遞增可以找出前幾個奇異局勢:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)……
以(m,n)列出下表:
由上表可以發現一些規律:
1.當m=0時,只有n=0時是奇異局勢,而只要n>0時,就是非奇異局勢,此時的非奇異局勢(0,n)可以通過適當的方法變為奇異局勢,因為只需取走n個石子即可;當n=0時,只有m=0時是奇異局勢,而只要m>0時,就是非奇異局勢,同樣,此時的非奇異局勢(m,0)可以通過適當的方法變為奇異局勢,因為只需取走m個石子即可;對(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)……分析可以得到同樣的規律,即上表中奇異局勢的下側和左側都是非奇異局勢並且都可轉化為奇異局勢,
2.對奇異局勢(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)……分析,可以發現:任何自然數都包含在乙個且僅有乙個奇異局勢中。而且下乙個奇異局勢中最小的數是前面奇異局勢中未出現的最小自然數,例如(4,7)中的4是(0,0)、(1,2)、(3,5)中未出現的最小自然數4。
根據以上性質,如果兩個人都採用正確操作,那麼面對非奇異局勢,先取者必勝;反之,則後取者必勝。
給定乙個(m,n),如何判斷它是不是奇異局勢呢?????????
結論是:如果存在自然數k(k=0,1,2,3……)使得m=[k(1+√5)/2],n=m+k(方括號表示取整函式),那麼(m,n)就是奇異局勢。
如果是非奇異局勢,那麼先手必贏,否則,後手必贏。
相應**如下:
#include#includevoid wzf(int a,int b)
k=b-a;
m=(k*(1.0+sqrt(5.0))/2.0);
if(m==b)
printf("0\n");//0代表輸
else
printf("1\n");//1代表贏
}int main()
威佐夫博奕
取石子遊戲 有兩堆石子,雙方輪流取走一些石子,合法的取法有如下兩種 1 在一堆石子中取走任意多顆 2 在兩堆石子中取走相同多的任意顆 約定取走最後一顆石子的人為贏家,求必勝策略。滿足下列公式的為必敗情況 k 第k中必敗情況。至於為什麼有這個 分割數 1 sqrt 5 2 這裡 m k k 1 sqr...
威佐夫博奕
接上次的巴什博奕之後,我在說說威佐夫博奕。仍然先簡單介紹一下 有兩堆物品若干,數量可以相同可以不同,兩個人輪流從某一堆任意取或是同時從兩堆中取同樣多的物品,規定每次至少取乙個,與巴什博奕不同,這裡沒有規定取出的物品的上限,最後取完物品的人獲得遊戲勝利。這種情況比之前的巴什博奕略微複雜一點。我們使用 ...
威佐夫博奕
1001 買單 time limit 1 sec memory limit 128 mb 64bit io format lld submitted 250 accepted 116 submit status web board description 2020年wh和cf在上海和平飯店約著吃飯,...