你和你的朋友,兩個人一起玩?Nim 游戲:桌子上有一堆石頭,每次你們輪流拿掉?1 - 3 塊石頭。 拿掉最后一塊石頭的人就是獲勝者。你作為先手。
你們是聰明人,每一步都是最優解。 編寫一個函數,來判斷你是否可以在給定石頭數量的情況下贏得游戲。
示例:
輸入: 4
輸出: false?
解釋: 如果堆中有 4 塊石頭,那么你永遠不會贏得比賽;
?? ? 因為無論你拿走 1 塊、2 塊 還是 3 塊石頭,最后一塊石頭總是會被你的朋友拿走。
思路:
如果堆中石頭的數量 nn 不能被 4 整除,那么你總是可以贏得 Nim 游戲的勝利。
推理
讓我們考慮一些小例子。顯而易見的是,如果石頭堆中只有一塊、兩塊、或是三塊石頭,那么在你的回合,你就可以把全部石子拿走,從而在游戲中取勝。而如果就像題目描述那樣,堆中恰好有四塊石頭,你就會失敗。因為在這種情況下不管你取走多少石頭,總會為你的對手留下幾塊,使得他可以在游戲中打敗你。因此,要想獲勝,在你的回合中,必須避免石頭堆中的石子數為 4 的情況。
同樣地,如果有五塊、六塊、或是七塊石頭,你可以控制自己拿取的石頭數,總是恰好給你的對手留下四塊石頭,使他輸掉這場比賽。但是如果石頭堆里有八塊石頭,你就不可避免地會輸掉,因為不管你從一堆石頭中挑出一塊、兩塊還是三塊,你的對手都可以選擇三塊、兩塊或一塊,以確保在再一次輪到你的時候,你會面對四塊石頭。
顯然,它以相同的模式不斷重復 n=4,8,12,16…,基本可以看出是 4 的倍數。
class Solution {public boolean canWinNim(int n) {return (n % 4 != 0);}
}
?