我和柯南拿石頭

2021-09-11 20:16:30 字數 2333 閱讀 2293

最近阿笠博士發明了一種新的遊戲,他邀請步美(ayumi)和柯南(conan)來玩。 遊戲的規則是這樣的。有一堆石子,石子的總數是n(0< n< =30)個。步美和柯南輪流從這堆石子中拿走m*m個石子(m必須是乙個正整數)。假如在輪到某個人取石子的時候,這個人沒有石子可以取(也就是石子已經被另乙個人在上次取光了),則這個人就是失敗者。 兩個人開始玩遊戲,每次都是步美先取,柯南再取(女士優先嘛)。並且兩個人都非常聰明,他們每次總是以最有利於自己獲勝的策略取石子。 玩了幾次之後,柯南很快發現,遊戲的勝負其實之和一開始石子的總數n有關。也就是說,只要給出了n,他就可以知道誰是最後的勝利者。怎麼樣,你發現了其中的規律嗎? 柯南用他的推理能力用腦子就可以得到答案了,現在,允許你用計算機寫程式解答。問題是,給出一開始的石子總數n,由你來判斷最後的勝利者。

輸入由多組測試資料組成。 第一行是乙個數number,表示測試資料的組數。 接下來是number行,每一行是乙個整數n(0 < n < = 30),表示石子總數。

對於每一組輸入,對應一行輸出。 假如最後的獲勝者是步美,則輸出ayumi win 假如最後的獲勝者是柯南,則輸出conan win

4252

527

ayumi win

conan win

conan win

ayumi win

第一題就難住了,我之前看到過類似去石頭,但是沒有遇到去拿整數平方的題,所以我的思想就變了:

錯誤思想:我將每乙個輸入都分解成所有正整數的平方和,假如個數為奇數就是a贏,偶數是b贏,但是這是錯的,舉個例子,8按我的思想或者**,會直接分解成4+4,這樣b就贏了,但是a是很聰明的人,她會先取1個,在讓b取,就是1+4+1+1+1,或者1+1+4+1+1或者1+1+1+1+4或者1+1+1+4+1,無論怎樣都是a贏,網上唯一能找的人也是這個思想,但是他沒發現自己的錯誤,而是用了窮舉。

今晚回去仔細看一下nim問題:

昨天晚上大致看了一下nim問題:

通常的nim遊戲的定義是這樣的:有若干堆石子,每堆石子的數量都是有限的,合法的移動是「選擇一堆石子並拿走若干顆(不能不拿)」,如果輪到某個人時所有的石子堆都已經被拿空了,則判負(因為他此刻沒有任何合法的移動)。

這遊戲看上去有點複雜,先從簡單情況開始研究吧。如果輪到你的時候,只剩下一堆石子,那麼此時的必勝策略肯定是把這堆石子全部拿完一顆也不給對手剩,然後對手就輸了。如果剩下兩堆不相等的石子,必勝策略是通過取多的一堆的石子將兩堆石子變得相等,以後如果對手在某一堆裡拿若干顆,你就可以在另一堆中拿同樣多的顆數,直至勝利。如果你面對的是兩堆相等的石子,那麼此時你是沒有任何必勝策略的,反而對手可以遵循上面的策略保證必勝。如果是三堆石子……好像已經很難分析了,看來我們必須要借助一些其它好用的(最好是程式化的)分析方法了,或者說,我們最好能夠設計出一種在有必勝策略時就能找到必勝策略的演算法。

昨天花了大量時間弄懂n-position(next)和p-position (previous)上,

上一次move的人有必勝策略的局面是p-position,也就是「後手可保證必勝」或者「先手必敗」;對於當前要move的人是先手

現在輪到move的人有必勝策略的局面是n-position,也就是「先手可保證必勝」。

更嚴謹的定義是:1.無法進行任何移動的局面(也就是terminal position)是p-position;2.可以移動到p-position的局面是n-position;3.所有移動都導致n-position的局面是p-position。

以nim遊戲為例來進行一下計算。比如說我剛才說當只有兩堆石子且兩堆石子數量相等時後手有必勝策略,也就是這是乙個p-position,下面我們依靠定義證明一下(3,3)是乙個p-position。首先(3,3)的子局面(也就是通過合法移動可以導致的局面)有(0,3)(1,3)(2,3)(顯然交換石子堆的位置不影響其性質,所以把(x,y)和(y,x)看成同一種局面),只需要計算出這三種局面的性質就可以了。 (0,3)的子局面有(0,0)、(0,1)、(0,2),其中(0,0)顯然是p-position,所以(0,3)是n-position(只要找到乙個是p-position的子局面就能說明是n-position)。(1,3)的後繼中(1,1)是p-position(因為(1,1)的唯一子局面(0,1)是n-position),所以(1,3)也是n-position。同樣可以證明(2,3)是n-position。所以(3,3)的所有子局面都是n-position,它就是p-position。通過一點簡單的數學歸納,可以嚴格的證明「有兩堆石子時的局面是p-position當且僅當這兩堆石子的數目相等」。

遊戲人i每次將非平衡轉化為平衡,之後,無論遊戲人ii如何取子,遊戲人i在取子後仍使得遊戲達到平衡。

拿石頭遊戲演算法題

有這樣乙個遊戲,桌上有一堆石子,每個人每次可以拿1到3塊石頭,誰最後一次拿走剩餘所有的石頭,則該玩家勝利。假設現在有2個玩家,而且這些玩家都是極為精通這個遊戲的。那麼要求寫乙個函式,引數為石子的數目,返回值為true和false。bool is first player win int n 當第乙個...

我要拿C幣

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...

拿Emacs對接我的cuckoo

cuckoo是乙個我自己開發的類似待辦事項的工具,執行在我本地的電腦上。它有如下兩個介面 傳入乙個unix epoch時間戳建立提醒 傳入乙個標題以及提醒的id來建立任務 這樣一來,便能在設定的時刻呼叫alerter在螢幕右上角彈出提醒。ps 讀者朋友們就不用執著於我的cuckoo究竟是怎樣的介面定...