描述
有一堆n個棋子,兩個玩家輪流從堆中拿走至少一個至多m個棋子,
每次拿的棋子數都可以不同,如果每個玩家都做出了最佳選擇,哪個玩家能夠順利拿走最后一個棋子?
解析
這種游戲的原型實例是拈游戲中的單堆棋子版本。現在假設游戲已經進行了一會,雙方都能做出最佳選擇,現在輪到你
情況:
1. 如果n=0,也就是你已經沒法走了,輸
2. 如果n=1~m,你可以拿走剩下全部棋子,下一步對方的情況是1,贏
3. 如果n=m+1,都會把對方推向情況2,輸
4. 如果n=m+2 ~ 2m+1(即m+1+m),拿走(1~m)個,將對方推向情況3,贏
5. 如果n=2(m+1)=2m+2,拿走任意個,將對方推向情況4,輸
結果
- 當n%(m+1)==0,結局必定為輸
- 當n%(m+1)!=0,獲勝
獲勝的策略是取走n%(m+1)個棋子。
實例
假設n=9,m=3。己方先手,按照上面得到的結論推導n%(m+1)!=0,所以己方獲勝。
- 9%(3+1)=1,取走1個
1
- 假設對方拿走3個(為方便)
2
- 5%4=1,取走1個
3
- 這次取走1個(隨意)
4
- 3%4=3,全部取走,獲勝
5
總結
所以根據初始n和m算出可以獲勝,只要按照確定的公式取走棋子,無論對方如何取都能確保獲勝。
拓展
對于一般性的拈游戲,即有多堆棋子,有一種令人稱奇的解法:
基于隊中棋子的二進制表示,b1/b2/b3/b4.....為各堆中棋子個數的二進制表示。當且僅當所有二進制異或和中包含至少一個1時,該實例為勝局,當且僅當所有二進制異或和中不包含1時,該實例為輸局。(異或和也可以看作沒有進位的加法)
如n1=4,n2=5,n3=6
4,5,6的二進制異或和
要使對方輸,就要使異或和所有位數都為0,這里無法實現。