力扣題解 292 Nim 遊戲

2021-10-07 15:33:46 字數 1306 閱讀 4528

292. nim 遊戲

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

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

示例:

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

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

思路:乙個找規律的題,挺有意思的:當我拿完還剩1、2、3個時,必敗,故我拿前有4個時必敗,所以只要在我拿前有5、6、7個時,就可以必勝(5個時拿走乙個,6拿2,7拿3,使對手轉入拿前4個的必敗狀態),所以我拿前還有8個時必敗(使對手轉入必勝的拿前5、6、7狀態)... ...

面對4的整數倍的人永遠無法翻身,你拿n根對手就會拿4-n根,保證每回合共減4根,你永遠對面4倍數,直到4. 相反,如果最開始不是4倍數,你可以拿掉剛好剩下4倍數根,讓他永遠對面4倍數。

題解

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

推理

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

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

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

**:

public boolean canwinnim(int n)
看著這個**陷入了沉思。。。。。。。

Leetcode實戰 292 Nim 遊戲

你和你的朋友,兩個人一起玩 nim 遊戲 桌子上有一堆石頭,每次你們輪流拿掉 1 3 塊石頭。拿掉最後一塊石頭的人就是獲勝者。你作為先手。你們是聰明人,每一步都是最優解。編寫乙個函式,來判斷你是否可以在給定石頭數量的情況下贏得遊戲。示例 輸入 4輸出 false 解釋 如果堆中有 4 塊石頭,那麼你...

292Nim 遊戲(智力題)

1 題目描述 你和你的朋友,兩個人一起玩 nim 遊戲 桌子上有一堆石頭。你們輪流進行自己的回合,你作為先手。每一回合,輪到的人拿掉 1 3 塊石頭。拿掉最後一塊石頭的人就是獲勝者。假設你們每一步都是最優解。請編寫乙個函式,來判斷你是否可以在給定石頭數量為 n 的情況下贏得遊戲。如果可以贏,返回 t...

LeetCode演算法題292 Nim遊戲解析

你和你的朋友,兩個人一起玩 nim遊戲 桌子上有一堆石頭,每次你們輪流拿掉 1 3 塊石頭。拿掉最後一塊石頭的人就是獲勝者。你作為先手。你們是聰明人,每一步都是最優解。編寫乙個函式,來判斷你是否可以在給定石頭數量的情況下贏得遊戲。示例 輸入 4 輸出 false 解釋 如果堆中有 4 塊石頭,那麼你...