2013-02-06 64 views
8

我一直在試圖找到一個由遊戲「三重鎮」啓發的問題的最佳算法。遊戲如下:最佳三重鎮算法

將對象放置在一個網格中,並且每次製作一組三個對象時,它們會壓縮成一個高級對象,放置在最後放置對象的位置。


basic transformation


而且,如果你把這三個B的對象,他們一起再次壓縮,形成一個更高級別的對象。


setting up for c


transformation to c


注意:在這些圖中的對象的電平被表示爲,B ,和c 下標表示對象麻木呃在三個集合中。

爲了簡化事情,我只考慮你要放置的每個對象的最低級別。

現在我的問題是:

1:是否有一個算法來確定網格區域,使水平x的對象所需的最低金額,定x?

例如,級別a需要1x1,級別b需要1x3,級別c需要1x5。

2:給定網格的尺寸,我們可以找到可實現的最高級別和數量的對象嗎?

例如,對於一個2x2的你可以得到2級「a和2級」 B的

3:是否有一個算法來尋找對象的最優順序和位置,以獲得儘可能高的級別,給予固定電網?

例如,對於2×2就可以得到(1,1),(1,2),(2,2)

4:給定一個預定的電平x物體的位置,移動的什麼組儘量減少製作這個物體所需的空間量?

5:這些算法的最佳複雜性是什麼?

更新:

有一件事,我認爲是在解決方案的發現突出的是,越來越級別x的項目不能在任何任意位置來完成。

例如:[ _ _ _ _ c]是不可能實現的固定的1乘5格,因爲你需要你的最後一個b在第5個地方,因此你的最後一個在第5個地方。所以要放置第一個b:[a _ _ _ _]->[a a _ _ _]->[_ _ b _ _][_ a _ _ _]->[_ a a _ _]->[_ _ _ b _]。在這兩種情況下,沒有足夠的空間放置3'a來製作c的最後一個b。

另一件事,我們不能假定任何東西都可以展開到1維網格。隨着我的下一點,這變得很清楚。

有趣的東西,我發現:

有一個最小親近的邊界,一個C級的對象可以是在一個維網格。 [_ _ a a a]->[_ _ _ b]->[_ a a a b]->[_ _ _ b b]->[a a a b b]->[_ _ c _ _]。因此,一個1乘5(最優)網格中的c級對象只能在第3個位置創建。

由此可以看出,這是可由任意數量的網格在1中產生的最高等級。通過無限電網採取1:

..._ a a a _ ... -> ... _ a a a b _ ... -> ... _ a a a b b _ ... -> ... _ c _ ...

現在我們設法讓另一種C直接旁邊:

..._ c a a a _ ... = ... _ c b _ ... or ... _ c _ b _ ... or ... _ c _ _ b _ ...

唯一的選擇是..._ c b _ ...因爲另作它不可能形成c和b之間的另一個b。我們唯一的選擇是阻止我們唯一的方法直接在我們的第一個c旁邊創建c,因爲它會阻止最後一個c到達那裏。因此,在一個維度中,c是我們可以創造的最高水平。換句話說,該問題必須在2維中考慮。

+2

這是一個問題和一半。 :) – biziclop

+0

你有任何中間結果? –

+0

只是我可以在我的腦海中發現的低網格值。仍然在思考處理它的最佳方式。 – Raufio

回答

2

編輯:下面實際上是錯誤的,這裏是爲什麼:做它描述得到一個「C」,這是怎麼回事: _ _ aaa - > _ _ _ _ b - >(..)_ _ _ bb - > _ _ bbb - > _ _ c _ _

因此,「c」現在位於該行的中間,並且預計不會以此方式工作。我把它留在這裏,所以如果有人閱讀它,至少有一個解釋它爲什麼是錯誤的。也許這會節省你一些時間考慮同樣的錯誤。


[FALSE從這裏] 1:你總是可以做到這一點在3 + 2 *(X-1),因爲你只是 「前加上」 所需的元素和字母的每一個 「級別」。通過歸納證明:

得到一個「b」,你需要3 + 2 *(1-1)= 3個空格。

如果你可以在3 + 2 *(x-1)空間中獲得等級x,等級x + 1需要3 + 2 *(x-1)個空間來構建等級x和2個存儲空間的角色, 3 + 2 *(x-1)+2 = 3 + 2 *((x + 1)-1)個空格。

所以你有它,你可以在1高度和5寬度的矩形中獲得「c」。您可以使用13個空格獲得「f」,依此類推。


想想這意味着:如果你想打包信成小面積,發現持有3 + 2 *(x-1)的空間,面積小且在需要時打開預謀。這意味着你總是可以從你想要以螺旋狀態結束的位置向外走。這裏是扭曲的:你可能需要每個關卡的最後一塊石頭來自交替的方向,所以你不會離開你開始的地方。實際經歷所有步驟的複雜性是O(3^x),因爲您需要下一個3個字母的前一個級別,並且它都是乘法的。