題目來自《程式設計之美》一排石頭的遊戲
n塊石頭排成一列,每塊石頭都有自己的固定位置,也就是相當於有自己的編號一樣。兩個玩家依次取石頭,每個玩家每次可以取其中任意一塊石頭,或者相鄰的兩塊,最後將所有石頭取走的玩家贏。
這個遊戲有必勝策略嗎?
取石子有很多變種,限定取石子的規則,就能產生不同的玩法。這類遊戲可以稱作博弈。博弈有乙個基本概念是必勝狀態和必敗狀態。玩家想贏的話,就必須每次都使自己走完之後,對方處在必敗狀態。(這裡假設遊戲雙方都是足夠聰明的)。
對於博弈類題目,我們一般事先很難看出如何處理,這裡有個技巧就是:從最簡單的情況開始,逐漸增加遊戲的難道,這樣看看能不能找出一些規律來。
對於這題,我們從討論一些簡單的特例出發。進而逐漸掌握解題的規律:
(1)當n = 1或者n= 2時, 先手贏。
(2)當n=3時,先手可以取走編號為2的石頭,這時,1和3是分開來的,後手無法一次取走,先手贏。
(3)當n=4時,先手取走中間編號為2和3的石頭,這就轉化為n=3時取走編號為2的石頭一樣的情況了,先手贏。
(4)當n>4時,我們發現乙個對稱性規律,先手如果想贏的話,就必須將石頭堆轉化為對稱的兩部分,如果n為偶數,取走中間兩塊,如果n為奇數,取走中間一塊,這樣就轉化 為對稱的兩部分。這時,先手可以採取策略——學後手走。後手在左邊一堆取任意位置的石子,先手則在右邊的一堆的石子中採用同樣的方式取走相同數量的石頭。這樣先手 也是必勝。
這樣看無論如何先手都是贏的。
1663 例 1 取石子遊戲 1
有一種有趣的遊戲,玩法如下 玩家2 人 道具n 顆石子 規則 1 遊戲雙方輪流取石子 2 每人每次取走若干顆石子 最少取 11 顆,最多取 kk 顆 3 石子取光,則遊戲結束 4 最後取石子的一方為勝。假如參與遊戲的玩家都非常聰明,問最後誰會獲勝?輸入僅一行兩個整數n和k 輸出 輸出僅一行,乙個整數...
取石子遊戲
如下 include include intmain k b a temp floor k 1.0 sqrt 5 2.0 if temp a printf 0 n else printf 1 n return 0 一 巴什博奕 bash game 只有一堆n個物品,兩個人輪流從這堆物品中取物,規定每...
取石子遊戲
有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子 二是可以在兩堆中同時取走相同數量的石子。最後把石子全部取完者為勝者。現在給出初始的兩堆石子的數目,如果輪到你先取,假設雙方都採取最好的策略,問最後你是勝者還是敗者。in...