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。


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM