1. 程式人生 > >Nim Game,一個有趣的遊戲,也是一道入門演算法題。

Nim Game,一個有趣的遊戲,也是一道入門演算法題。

Nim Game,其實很多人都玩過。其實就是我們玩的劃線遊戲。

一張紙上,畫若干條線,雙方一人劃一次,每次劃掉1~3條線。可以選擇畫1條,也可以劃2條,也可以3條。具體劃去幾條線完全看自己的策略。誰劃掉最後一條線,就是贏家。
Nimgame

如上圖,藍方獲勝。

正在看這篇文章的你一定是一個聰明人,每一步都是最優解,而你的對手,也跟你一樣聰明,每步都是最優的解法。
現在你作為先手,線上條總數為多少的時候,你必贏呢,又在多少的時候必輸呢?

可不可以用一個函式來判斷線上條總是為x時你的輸贏情況呢?這樣你以後跟別人玩這個遊戲的時候就不會輸啦。

答案是可以,不過我們要先來分析一下這個問題。

線上的總是為多少的時候一定會輸呢。

每人每步最多劃三條線,所以線的總是至少為4條。當線的總數為4條的時候,不管先手劃幾條線,後手都有應對的方法,先手必輸。

所以你會發現8條也是必輸,8條線可以分成兩個部分,每個部分四條線。自然先手還是必輸。4這個數字還真是不太吉利。

當線的總數為5條的時候,先手先劃掉一條線,後手就等於是在4條線的情況下先手,自然後手輸。

而6條 7條 先手都可以劃掉2條線和3條線來讓後手落入“4”的陷阱。

所以我們可以看出,我們只要遠離”4“就行了。當線的總數不是4的倍數的時候,先手必贏。

看到這裡,恭喜你掌握了必勝法則,下次各位盆宇就可以用這個遊戲跟別人打賭了。

所以現在我們可以將我們的結論寫到程式碼裡了。

在這裡我將實現一個C語言的函式:

bool canWin(int n) {
    return n%4;
}

引數 n 代表的是線條的總數。 通過線條總是是否能被4整除來判斷這場比賽中作為先手的你必贏還是必輸。

當 n%4 的結果為0時意味著n能被4整除,返回0,轉換為布林值為false。

當n%4不等於0時意味這n不能被4整除,返回非0,轉換為布林值為true。

好了,下次玩這個遊戲你就知道該怎麼玩了吧。(手動斜眼)