8

我一直在尝试为受游戏“三联镇”启发的问题找到最佳算法。游戏是这样进行的:

您将对象放置在一个网格中,每次您制作一组三个时,它们都会在最后放置的对象的位置凝结成一个更高级别的对象。


基本转变


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


为 c 设置


转换为 c


注意:在这些图中,对象的级别表示为 a 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 网格中是不可能实现的,因为您需要最后一个 b 在第 5 位,因此您的最后一个 a 在第 5 位。所以要放置第一个 b:[a _ _ _ _]->[a a _ _ _]->[_ _ b _ _][_ a _ _ _]->[_ a a _ _]->[_ _ _ b _]. 在这两种情况下,都没有足够的空间来放置 3 个 a 来制作 c 的最后一个 b。

另一件事,我们不能假设任何东西都可以展开为一维网格。这一点在我的下一点中变得很清楚。

我发现了一些有趣的东西:

一个 c 级对象可以在一维网格中与边界的最小接近度。[_ _ a a a]->[_ _ _ b]->[_ a a a b]->[_ _ _ b b]->[a a a b b]->[_ _ c _ _]. 因此,只能在第 3 个位置制作 1 x 5(最佳)网格中的 c 级对象。

由此可见,这是可以由任何数字网格在 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 个维度上考虑

4

1 回答 1

2

编辑:以下内容实际上是错误的,原因如下:按照描述的方式获得“c”,这是怎么回事:_ _ aaa -> _ _ _ b -> (..) _ _ _ bb -> _ _ bbb -> _ _ c _ _

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


[FALSE FROM HERE] 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 个字母,而且都是乘法的。

于 2013-02-06T23:12:08.117 回答