今天分享一道超簡單的博弈題,經過找規律的方式來發現其中的奧祕,最後只須要一行代碼解決。spa
愛麗絲和鮑勃一塊兒玩遊戲,他們輪流行動。愛麗絲先手開局。code
最初,黑板上有一個數字 N
。在每一個玩家的回合,玩家須要執行如下操做:遊戲
x
,知足 0 < x < N
且 N % x == 0
。 N - x
替換黑板上的數字 N
。 若是玩家沒法執行這些操做,就會輸掉遊戲。數學
只有在愛麗絲在遊戲中取得勝利時才返回 True
,不然返回 false
。假設兩個玩家都以最佳狀態參與遊戲。io
示例 1:class
輸入:2
輸出:true
解釋:愛麗絲選擇 1,鮑勃沒法進行操做。複製代碼
示例 2:分享
輸入:3
輸出:false
解釋:愛麗絲選擇 1,鮑勃也選擇 1,而後愛麗絲沒法進行操做。複製代碼
提示:di
1 <= n="" <="1000
對於這種博弈類的題目,若是沒有思路的話咱們不妨多舉幾個例子,嘗試着從中找尋規律。vi
N = 1
,愛麗絲沒得選擇,直接失敗,即 鮑勃獲勝; N = 2
,愛麗絲有選擇,她能夠選擇 x = 1
,鮑勃面對的就是 N = 2 - 1 = 1
,沒法操做,愛麗絲獲勝; N = 3
,愛麗絲只能選擇 x = 1
,由於選 x = 2
不知足 3 % 2 = 0
,鮑勃面對的就是 N = 3 - 1 = 2
,參考上面 N = 2
的情形,此時鮑勃爲 N = 2
的先手,鮑勃獲勝; N = 4
,愛麗絲能夠選擇 x = 1
來使鮑勃遇到 N = 3
的狀況,愛麗絲獲勝; 貌似有個規律:N 爲奇數時, 鮑勃獲勝;N 爲偶數時, 愛麗絲獲勝。copy
是這樣嗎?
是的。
事實上,不管 N 爲多大,最終都是在 N = 2 這個臨界點結束的。誰最後面對的是 N = 2 的情形,誰就能獲勝(這句話不太理解的話,仔細看看 N = 二、N = 3 這兩種情形)。
接下來,咱們得知道一個數學小知識:奇數的因子(約數)只能是奇數,偶數的因子(約數)能夠是奇數或偶數。
千萬不要忽略 1 也是因子!
愛麗絲是遊戲開始時的先手。
N - x
替換黑板上的數字 N
,鮑勃面對的就是奇數 N,只能選擇 N 的奇數因子 x,奇數 - 奇數 = 偶數
,此時傳給愛麗絲的又是偶數。這樣輪換下去愛麗絲會遇到 N = 2 的情形,而後獲勝; class Solution {
public boolean divisorGame(int N) {
return N % 2 == 0;
}
}複製代碼