益智問題(拈之變形) - 拼圖

Table of Contents

原文恕刪

如果是演算法的話,我覺得應該可以用一個N^2的做法(不確定對不對)

如果是以最多拿兩倍來看(三被其實是一樣的做法)

先做一個二維的表,橫軸代表剩下的數量,縱軸代表上一個回合拿了幾個

因此每一格都是一個狀態,假設x代表處於該狀態的玩家輸了,那麼,

對於n=0時,都應標上x


10 x
09 x
08 x
07 x
06 x
05 x
04 x
03 x
02 x
01 x
00 01 02 03 04 05 06 07 08 09 10 n

那麼,對於某一格(n,m)的狀態呢?我們需要檢查他所有可能的下一步,

Ex : n = 10 , m = 1 時,可能的下一步為:(9,1) , (8,2) 只要有任一格為x

則本格的值就不是x,而是空白。

因此,填完之後,表格會變成:



10 x
09 x
08 x
07 x
06 x
05 x
04 x
03 x x
02 x       x x
01 x x  x x
00 01 02 03 04 05 06 07 08 09 10 n

如果用上述的方法,複雜度為N^3 但是,對於任一的 n 都有一個性質,

就是存在一個 m_0 使得 ( n , m ) , m <= m_0 都是x

那要如何找到 m_0 呢? 我們可以發現,若要由 n1 直接走到 n2 的方法就是

拿走 n1-n2 個火柴 那我們會走到 ( n2 , n1-n2 ) 的狀態,對於固定的n1,不論 m

為多少,所要檢查的 (n2,n1-n2) 都會落在一條直線上,也就是 X+Y= n1

我們將 (n2,n1-n2) 改寫成: ( n-m , m ) 那麼,我們從 m=1 開始,枚舉所有的m

( m <= n ) 必存在一個m'使的 ( n-m , m ) , m < m' 接不為x,也就是說,

只要該玩家可以移動的步數小於 m'他就不可能移動到x的格子上

=> m_0 = [m'/2] ......... []為下高斯

因此,對於起始狀態為n根火柴的遊戲,可以用 O(n^2)的時間做出這張表,接下來就只要

照著表上所話的,每一次都移動到畫有x的格子就可以了

(由此表也可以發現只要開始時,火柴的數量為fibonacci數,則必敗)


--

All Comments