無盡演算法之 Nim 遊戲

2021-10-02 08:37:10 字數 875 閱讀 3018

你和你的朋友,兩個人一起玩 nim 遊戲:桌子上有一堆石頭,每次你們輪流拿掉 1 - 3 塊石頭。 拿掉最後一塊石頭的人就是獲勝者。你作為先手。

你們是聰明人,每一步都是最優解。 編寫乙個函式,來判斷你是否可以在給定石頭數量的情況下贏得遊戲。

示例:輸入: 4

輸出: false

解釋: 如果堆中有 4 塊石頭,那麼你永遠不會贏得比賽;

因為無論你拿走 1 塊、2 塊 還是 3 塊石頭,最後一塊石頭總是會被你的朋友拿走。

思路:如果堆中石頭的數量 n 不能被 4 整除,那麼你總是可以贏得 nim 遊戲的勝利。

推理讓我們考慮一些小例子。顯而易見的是,如果石頭堆中只有一塊、兩塊、或是三塊石頭,那麼在你的回合,你就可以把全部石子拿走,從而在遊戲中取勝。而如果就像題目描述那樣,堆中恰好有四塊石頭,你就會失敗。因為在這種情況下不管你取走多少石頭,總會為你的對手留下幾塊,使得他可以在遊戲中打敗你。因此,要想獲勝,在你的回合中,必須避免石頭堆中的石子數為 4 的情況。

同樣地,如果有五塊、六塊、或是七塊石頭,你可以控制自己拿取的石頭數,總是恰好給你的對手留下四塊石頭,使他輸掉這場比賽。但是如果石頭堆裡有八塊石頭,你就不可避免地會輸掉,因為不管你從一堆石頭中挑出一塊、兩塊還是三塊,你的對手都可以選擇三塊、兩塊或一塊,以確保在再一次輪到你的時候,你會面對四塊石頭。

顯然,它以相同的模式不斷重複 n=4,8,12,16 基本可以看出是 4 的倍數。

題解:

class

solution

}

或者利用位計算

n&3==0 證明 最少後兩位都是00 最少是100, 所以相當於能整除4.

class

solution

}

無盡演算法之 翻轉遊戲

你和朋友玩乙個叫做 翻轉遊戲 的遊戲,遊戲規則 給定乙個只有 和 的字串。你和朋友輪流將 連續 的兩個 反轉成 當一方無法進行有效的翻轉時便意味著遊戲結束,則另一方獲勝。請你寫出乙個函式,來計算出每個有效操作後,字串所有的可能狀態。示例 輸入 s 輸出 注意 如果不存在可能的有效操作,請返回乙個空列...

博弈之Nim遊戲

nim遊戲規則 兩個人甲和乙的取石子遊戲,共有n堆不同的石子,編號1.n,第i堆中有a i 個石子。每一次行動,甲和乙可以選擇從一堆石子中取出任意數量的石子。至少取1個,至多取完。兩人輪流行動,取走最後乙個石子的人獲得勝利 當某人不能取時失敗 問,兩人均取最優策略,誰會勝利?介紹一下博弈中兩個概念 ...

博弈論演算法之nim遊戲

有三堆各若干個物品,兩個人輪流從某一堆取任意多的物品,規定每次至少取乙個,多者不限,最後取光者得勝。它與二進位制有密切關係,我們用 a,b,c 表示某種局勢,首先 0,0,0 顯然是奇異局勢,無論誰面對奇異局勢,都必然失敗。第二種奇異局勢是 0,n,n 只要與對手拿走一樣多的物品,最後都將導致 0,...