題目
You are playing the following Nim Game with your friend: There is a heap of stones on the table, each time one of you take turns to remove 1 to 3 stones. The one who removes the last stone will be the winner. You will take the first turn to remove the stones.
Both of you are very clever and have optimal strategies for the game. Write a function to determine whether you can win the game given the number of stones in the heap.
For example, if there are 4 stones in the heap, then you will never win the game: no matter 1, 2, or 3 stones you remove, the last stone will always be removed by your friend.
解題思路
題目大意是你跟另一玩家玩石頭游戲,規則如下:桌子上有一堆石頭,每輪每個人輪流拿1到3個石頭,拿走最后一個石頭的玩家為贏家,前提是每個玩家都會采取最佳策略來進行這個游戲,而且每次都是從你開始第一輪游戲。題目給定每次游戲的石頭總數,要求你寫一個function判斷你自己是否可以贏下這場游戲。
初看題目,僅僅根據游戲開始時的石頭總數就能判定最終贏家是誰,感覺好像有點難,一時無從下手。但一想到這題是easy題,肯定不會有多難,只是一下子被題目嚇到了。于是我從抽屜抽出一張陳舊草稿紙,開始先窮舉石頭總數,果然功夫不負有心人,最后發現這題明顯有規律。
當石頭個數小于 4 時,因為第一次是你開始拿,所以贏家肯定是你。當石頭個數等于 4 時,如題中所述,不管你第一次是拿一個兩個還是三個石頭,最后一個石頭肯定是你的對手拿走,所以你肯定是輸的。那當石頭個數是 5 的時候呢?很明顯,你第一次只需拿走一個石頭就能贏得游戲,因為當你拿走一個石頭后,就只剩下4個石頭給對手了,而對手就會陷入之前的“四石頭”境地,即無論對手選擇拿幾個石頭,最后都會輸掉游戲。以此類推,當石頭總數是 6 和 7 個時,你只需拿走 2 和 3 個石頭就能確保自己贏得游戲。但當石頭總數等于 8 時,無論你怎么拿都注定會陷入“四石頭”境地,所以會輸掉比賽。從而最終得出游戲規律,當一開始的石頭總數是4的倍數的時候,你都會輸掉比賽,反正則可以獲得勝利。
參考代碼
class Solution {
public:
bool canWinNim(int n) {
return n % 4 != 0 ;
}
};
反思與總結
看了代碼,是不是覺得巨簡單- -。其實很多題目都是這樣,一開始可能會覺得很棘手,這時候需要自己沉下心,先寫出前幾個簡單實例,然后試試在其中能不能找出規律,往往答案可能會比你想象的簡單得多。