2013-02-06 62 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个字母的前一个级别,并且它都是乘法的。