1. 程式人生 > >【整理自用】清奇思路(一)NIM遊戲、(一堆石頭,最後一個勝利)

【整理自用】清奇思路(一)NIM遊戲、(一堆石頭,最後一個勝利)

NIM遊戲類似

  1. 一共有N堆石子,編號1..n,第i堆中有個a[i]個石子。每一次操作Alice和Bob可以從任意一堆石子中取出任意數量的石子,至少取一顆,至多取出這一堆剩下的所有石子。兩個人輪流行動,取走最後一個的人勝利Alice為先手。
  2. 招行的那道題:有A,B,C 三間。裡面分別有一定數量的面試官。小張和小玲兩個HR,每一次可以從任意一個房間中派出任意數量的面試官至少派1個,至多派出這一房間剩下的所有**。兩個人輪流行動,如果最後沒人,就需要自己出差。請設計函式,選擇最優策略,如果小玲不出差,輸出第一步結果,否則輸出1。

觀察黑色字型加粗的部分不難發現,兩者之間存在著大量的相似性表達。在知乎上進行搜尋後查到,該問題被稱為:NIM

遊戲。

1.NIM遊戲概念

贏得尼姆遊戲利用類似列舉的方式,向我們展示了在各類操作下,如何才能找出必勝策略。
趣味數學知乎上的問題相對詳細闡述了這個問題。
因此,上述問題抽象可得:

若P:表示當前局面下先手必敗
N:表示當前局面下先手必勝

N,P狀態的轉移滿足如下性質:
1. 合法操作集合為空的局面為P;
2. 可以移動到P的局面為N,這個很好理解,只要能轉換到P局面,那麼先手只需要使操作後變成P局面,那麼後手就面臨了一個必敗的狀態。
3. 所有移動只能到達N的局面為P。無論怎麼選取都會留給對手一個必勝狀態。
三大定理:
1. 遊戲結束時,所有的數都是0,異或結果為0
2. 任何一個“異或結果為0的局面”,經過一次操作,必然異或結果不是0。
3. 任何一個“異或結果[不]為0的局面”,經過一次操作必然可以讓它變為0。(非常重要!)

第一個命題顯然,最終局面只有一個,就是全0,異或仍然是0。
第二個命題,對於某個局面(a1,a2,…,an),若a1^a2^…^an!=0(不等號就用C++的習慣用!=來表示了),一定存在某個合法的移動,將ai改變成ai’後滿足a1^a2^…^ai’^…^an=0。不妨設a1^a2^…^an=k,則一定存在某個ai,它的二進位制表示在k的最高位上是1(否則k的最高位那個1是怎麼得到的)。這時aik<ai一定成立。則我們可以將ai改變成ai’=ai^k,此時a1^a2^…^ai’^…^an=a1^a2^…^an^k=0。
第三個命題,對於某個局面(a1,a2,…,an),若a1^a2^…^an=0,一定不存在某個合法的移動,將ai改變成ai’後滿足a1^a2^…^ai’^…^an=0。因為異或運算滿足消去率,由a1^a2^…^an=a1^a2^…^ai’^…^an可以得到ai=ai’。所以將ai改變成ai’不是一個合法的移動。證畢。