最优的三重城镇算法

时间:2013-02-06 22:43:36

标签: algorithm

我一直在努力为游戏“三重城镇”启发的问题找到最佳算法。游戏就这样:

您将对象放置在网格中,每次制作一组三个对象时,它们会在最后一个放置对象的位置压缩为一个较高级别的对象。


basic transformation


此外,如果将这些b对象中的三个放在一起,它们会再次压缩以形成更高级别的对象。


setting up for c


transformation to c


注意:在这些图中,对象的级别表示为 i ,b i ,c i ,下标表示对象数以三个为一组。

为简化起见,我只考虑你必须放置的每个物体的最低等级。

现在我的问题是:

1:在给定x的情况下,是否有算法确定制作x级对象所需的最小网格区域数量?

例如,对于等级a,您需要1x1,对于等级b,您需要1x3,对于等级c,您需要1x5。

2:鉴于网格的尺寸,我们能找到最高水平和可实现的物体数量吗?

例如,对于2x2,您可以获得2级'a'和2级'​​b'

3:在给定固定网格的情况下,是否有算法可以找到对象的最佳顺序和位置以获得最高级别?

例如,对于2x2,您可以得到(1,1),(1,2),(2,2)

4:给定一个预期等级x对象的位置,什么样的移动最小化了制作这个对象所需的空间量?

5:这些算法的最佳复杂性是什么?

更新

我认为在找到解决方案时突出的一点是获得x级项目无法在任意位置完成

例如:[ _ _ _ _ c]无法在固定的1 x 5网格中实现,因为你需要你在第5位的最后一个b,因此你的最后一个在第5位。所以要放置第一个b:[a _ _ _ _]->[a a _ _ _]->[_ _ b _ _][_ a _ _ _]->[_ a a _ _]->[_ _ _ b _]。在这两种情况下,都没有足够的空间放置3'a来制作c的最后一个。

另一件事,我们不能假设任何东西都可以展开到一维网格。我的下一点就变得清晰了。

我找到了一些有趣的东西:

c级对象可以在1维网格中的边界最小接近度。 [_ _ 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维中考虑问题

1 个答案:

答案 0 :(得分:2)

编辑:下面的内容实际上是假的,这就是为什么:做它描述得到的“c”,这是怎么回事: _ _ a a a - > _ _ _ _ b - > (..)_ _ _ b b - > _ _ b b b - > _ _ c _ _

所以“c”现在位于该行的中间,并且前置不会以这种方式工作。我把它留在这里,所以如果有人读了它,至少有一个解释为什么它是假的。也许这会让你省时间思考同样的错误。


[从这里虚假] 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个字母用于下一个,并且它都是乘法的。