尼姆博弈(巴什博奕)

2021-07-16 05:45:46 字數 1009 閱讀 6728

##尼姆博弈

有三堆各若干個物品,兩個人輪流從某一堆取任意多的物品,規定每次至少取乙個,多者不限,最後取光者得勝。

這種情況最有意思,它與二進位制有密切關係,我們用(a,b,c)表示某種局勢,首先(0,0,0)顯然是奇異局勢,無論誰面對奇異局勢,都必然失敗。第二種奇異局勢是(0,n,n),只要與對手拿走一樣多的物品,最後都將導致(0,0,0)。仔細分析一下,(1,2,3)也是奇異局勢,無論對手如何拿,接下來都可以變為(0,n,n)的情形。

計算機演算法裡面有一種叫做按位模2加,也叫做異或的運算,我們用符號(+)表示這種運算,先看(1,2,3)的按位模2加的結果:

1 =二進位制01

2 =二進位制10

3 =二進位制11 (+)

———————

0 =二進位制00 (注意不進製)

對於奇異局勢(0,n,n)也一樣,結果也是0。

任何奇異局勢(a,b,c)都有a(+)b(+)c =0。

注意到異或運算的交換律和結合律,及a(+)a=0,:

a(+)b(+)(a(+)b)=(a(+)a)(+)(b(+)b)=0(+)0=0。

所以從乙個非奇異局勢向乙個奇異局勢轉換的方式可以是:

1)使 a = c(+)b

2)使 b = a(+)c

3)使 c = a(+)b

這裡有n堆石子,每堆石子有a[i](1<=i<=n)個,每人輪流從其中的某一堆石子中拿出任意個石子(只能在其中一堆拿,不能不拿),大和先手,誰拿出了最後乙個石子,誰輸。若大和必勝,輸出「yamato_saikou!」,若依阿華必勝,輸出「meidikeji_shijiediyi!」,若兩邊都無法必勝,輸出「sayonara_konosekai!」.

題解:

#includeint main()

if(ans)

printf("the first win\n");

else

printf("the second win\n");

}return 0;

}

巴什博奕 尼姆博弈

只有一堆n個物品,每次至少取a個,最多取b個 問題可分為 1.最後取完者勝 面臨 a b k個物品的人必敗 2.最後取完者敗 面臨 a b k a個物品的人必敗 因此當兩個都極其聰明的人博弈時,就看有多少個物品,自己先手取了之後能否讓對手面臨必敗點 對於最後取完者勝的情況 對取物品方面又可分為 最後...

博弈(巴什博奕 尼姆博弈)

1.巴什博奕 一堆 n個物品 兩人輪流從中取物品每人至少拿乙個最多拿m個將這堆物品最後取完的是winner先手勝利條件 n m 1 0 誰面對 m 1 k的情況誰就輸了 k為正整數 include int main return 0 2.尼姆博弈 三金和敵人決戰了!對手是一名和三金同樣強大帥氣的玩家...

NYOJ135 取石子(二)尼姆博弈 巴什博奕

尼姆博弈和巴什博奕的結合 題目思路 每一堆的必勝狀態是 m n 1 然後對每一堆的最優解進行異或,如果是非平衡狀態則先手必勝,否則先手必敗。2017年8月23日23 32 33 nyoj135 nimm bash ac include include include include include ...