一般對於這類博弈類的題目,都有一個條件:“兩人足夠聰明”或者"兩人沒有失誤"
硬幣遊戲
想必大家小時候都有玩過這麼一個遊戲
兩個人博弈,每個人每次可以拿1-3枚硬幣,輪流拿,總共n枚硬幣,最後取光者勝,這就是一個很典型的巴什博弈
對於上面的取硬幣問題,我們舉三個例子
不妨設甲是先手,乙是後手
- 總共4枚硬幣,甲無論怎麼取都是輸
- 總共5枚硬幣,甲只要第一次取1枚硬幣,乙無論怎麼取,甲都是贏
- 總共4n枚硬幣,甲無論怎麼取都是輸,甲每次取x枚,乙接著取4-x枚,乙就一定能贏
這就是一個很典型的巴什博弈
巴什博弈
巴什博弈(Bash Game):只有一堆n個物品,兩個人輪流從這堆物品中取物,規
定每次至少取一個,最多取m個。最後取光者得勝。
顯然,如果\(n=m+1\),那麼由於一次最多隻能取\(m\)個,所以,無論先取者拿走多少個,後取者都能夠一次拿走剩餘的物品,後者取勝。因此我們發現瞭如何取勝的法則:如果\(n=(m+1)*r+s\),(\(r\)為任意自然數,\(s\le m\)),那麼先取者要拿走\(s\)個物品,如果後取者拿走\(k(k\le m )\)個,那麼先取者再拿走\(m+1-k\)個,結果剩下\((m-1)\times (r-1)\)個,以後保持這樣的取法,那麼先取者肯定獲勝。總之,要保持給對手留下\(1. (m+1)\)的倍數,就能最後獲勝。
巴什博弈博弈論裡面最簡單的一種形式。以下題目利用巴什博弈可以輕鬆解決:
-
http://acm.hdu.edu.cn/showproblem.php?pid=1846 (brave game)
-
http://acm.hdu.edu.cn/showproblem.php?pid=2147 (kiki's game)
-
http://acm.hdu.edu.cn/showproblem.php?pid=2149 (public sale)
下面介紹分析此類題目的通用方法:P/N分析:
P點: 即必敗點,某玩家位於此點,只要對方無失誤,則必敗;
N點: 即必勝點,某玩家位於此點,只要自己無失誤,則必勝。
以上題目均可以通過P/N分析法來解決。
例如上面的硬幣問題,4的倍數點都是P點,其他點都是N點
三個定理
一、所有終結點都是必敗點P(上游戲中,輪到誰拿牌,還剩0張牌的時候,此人就輸了,因為無牌可取
二、所有一步能走到必敗點P的就是N點
三、通過一步操作只能到N點的就是P點
程式碼實現
bool Bash_Game (int n,int m){//判斷先手是否必贏
if(n%(m+1)==0)return false;
else return true;
}
本文參照:https://www.cnblogs.com/java20130726/archive/2013/05/24/3218207.html