超簡單的博弈算法題,一行代碼解決!

今天分享一道超簡單的博弈題,經過找規律的方式來發現其中的奧祕,最後只須要一行代碼解決。spa

題目描述

愛麗絲和鮑勃一塊兒玩遊戲,他們輪流行動。愛麗絲先手開局。code

最初,黑板上有一個數字 N 。在每一個玩家的回合,玩家須要執行如下操做:遊戲

  • 選出任一 x,知足 0 < x < NN % x == 0
  • N - x 替換黑板上的數字 N

若是玩家沒法執行這些操做,就會輸掉遊戲。數學

只有在愛麗絲在遊戲中取得勝利時才返回 True,不然返回 false。假設兩個玩家都以最佳狀態參與遊戲。io

示例 1:class

輸入:2
輸出:true
解釋:愛麗絲選擇 1,鮑勃沒法進行操做。複製代碼

示例 2:分享

輸入:3
輸出:false
解釋:愛麗絲選擇 1,鮑勃也選擇 1,而後愛麗絲沒法進行操做。複製代碼

提示:di

  1. 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 爲偶數時,她 必定能夠 選到一個 N 的奇數因子 x(好比 1 ),將 N - x 這個奇數傳給鮑勃;用 N - x 替換黑板上的數字 N ,鮑勃面對的就是奇數 N,只能選擇 N 的奇數因子 x,奇數 - 奇數 = 偶數,此時傳給愛麗絲的又是偶數。這樣輪換下去愛麗絲會遇到 N = 2 的情形,而後獲勝;
  • 當愛麗絲遇到的 N 是奇數時,只能傳給鮑勃偶數或沒法操做 (N = 1) ,沒法獲勝。

代碼實現

class Solution {
    public boolean divisorGame(int N) {
        return N % 2 == 0;
    }
}複製代碼
相關文章
相關標籤/搜索