做這道題時想到當初和我哥玩的遊戲,每個人都只能報出1-3,兩人輪換,從0開始,誰能報數22誰贏。
題目描述
你和你的朋友,兩個人一起玩 Nim 遊戲:桌子上有一堆石頭,每次你們輪流拿掉 1 - 3 塊石頭。 拿掉最後一塊石頭的人就是獲勝者。你作爲先手。
你們是聰明人,每一步都是最優解。 編寫一個函數,來判斷你是否可以在給定石頭數量的情況下贏得遊戲。
算法
看到題本來是懵逼的,但是看到例子突然有了思路。
輸入: 4
輸出: false
解釋: 如果堆中有 4 塊石頭,那麼你永遠不會贏得比賽;因爲無論你拿走 1 塊、2 塊 還是 3 塊石頭,最後一塊石頭總是會被你的朋友拿走。
易知,n=1~3,先手贏;n=4,後手贏;n=5,此時先手拿1,n=4,先手變後手,先手贏。
推到n=8,此時後手贏。
易知n爲4的倍數,後手贏,除此,先手一定贏。
很容易得到算法:
if n>0:
if n%4==0:return False
return True
return False
if n==0:return False
return True if n%4!=0 else False
考慮到n本就不應該爲0,所以最終結果:
return n%4
拓展
我想如果規則是先手拿走1~4,那麼n=5時一定是後手贏,所以拓展規則應該是:
對規則要求每次拿走1~k個石子,石子數n爲k+1的倍數時後手贏。除此,先手必須保證他第一步拿走石子後石子總數爲k+1的倍數,這樣先手一定贏。