今天我們來聊一聊另一種博弈--尼姆博弈,這一種博弈可以說是巴什博弈的一種變體,巴什博弈中「石子」的堆數為1堆,而在利姆博弈中「石子」的堆數為n堆,還有在尼姆博弈中取石子的規則也發生了變化,前一種博弈中取石子的數量限定在[1,l],而後一種取石子的數量可以為任意數(但不能不取,而且還不能超過這一堆石子的總數),同樣也是兩人輪流來取,先取完者獲勝。
下面我們進行一下分析:
(1) 先假設只有兩堆石子,當兩者數量相同的時候,先手必敗(先手從一堆中取a個石子,後手模仿先手從另一堆也取a個,最後一定是先手敗);當兩者數量不相等時,先手可以通過取石子將兩堆石子變為的數量變為一樣,這樣,後手就面臨必敗態了。
綜合來看的話:當誰面臨「兩堆石子的數量相等」這一狀態時,誰就必敗。
(2) 現在我們將情況推廣到普通狀態,我們先假設存在兩堆石子a=7,b=5。這是兩堆數量不同的石子堆,通過二進位制拆分可以將他們化為:111 101,也就是(4+2+1)(4+1),我們現在可以將其視為5堆石子,其中有兩堆數量為4,兩堆數量為1的石子,也就是說,誰面臨這種情況,誰就必敗。而最後一堆誰將它一次性全部拿走,誰就是贏家。而通過二進位制拆分可以將兩堆數量分別為4、1的石堆歸零不計。而通過異或這一操作正好可以達到這一要求。
由上得到結論:對每一堆石子的數量進行異或,最終的值為0時(尼姆和),先手必敗,反之,先手必勝。
典型例題:
題意:n堆石子,兩個人輪流取,先取完者獲勝。
題解:尼姆博弈的模板,直接套用。
**:
#include#include#define ll long long
using
namespace
std;
intmain()
if(sum==0) cout<<"no"
yes"
<}
return0;
}
hdu - 2176
hdu-1850
博弈論(尼姆博弈)
尼姆博弈指的是這樣乙個博弈遊戲 有任意堆物品,每堆物品的個數是任意的,雙方輪流從中取物品,每一次只能從一堆物品中取部分或全部物品,最少取一件,取到最後一件物品的人獲勝。結論就是 把每堆物品數全部異或起來,如果得到的值為0,那麼先手必敗,否則先手必勝。這樣理解 先手必敗態為面臨的所有堆都為0,而此時的...
博弈(巴什博奕 尼姆博弈)
1.巴什博奕 一堆 n個物品 兩人輪流從中取物品每人至少拿乙個最多拿m個將這堆物品最後取完的是winner先手勝利條件 n m 1 0 誰面對 m 1 k的情況誰就輸了 k為正整數 include int main return 0 2.尼姆博弈 三金和敵人決戰了!對手是一名和三金同樣強大帥氣的玩家...
博弈論之尼姆博弈
有三堆分別有 a,b,c 個物品,兩個人輪流從某一堆取任意多的物品,規定每次至少取乙個,多者不限,最後取光者得勝。當 a b c 0 時,先手必敗 反之,先手必勝。對於 a,b,c 三個數,我先假設 a 最大,b 第二大,c 最小,且 a,b,c 對應的二進位制位數分別為 x,y,z 那麼,要使得 ...