【问题标题】:Optimal triple town algorithm最优三镇算法
【发布时间】:2013-02-06 22:43:36
【问题描述】:

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

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



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




注意:在这些图中,对象的级别表示为 ai、bi 和 ci,下标表示三个一组中的对象编号。

为了简单起见,我只考虑你必须放置的每个对象都是最低级别的。

现在我的问题是:

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 是我们可以制作的最高级别。换句话说,问题必须从二维角度考虑

【问题讨论】:

  • 这是一个半问题。 :)
  • 有中间结果吗?
  • 只是那些我能在脑海中找出的低网格值。仍在考虑解决问题的最佳方法。
  • 可以用 1x6 制作一个 c 级对象吗?
  • 为什么级别 c 需要 2x3?我认为您的示例表明您总共需要 5 个空格(1x5)。您是否想要具有最小周长的二维网格?如果是这样,那很重要!

标签: algorithm


【解决方案1】:

编辑:以下内容实际上是错误的,原因如下:按照它描述的方式获得“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 个字母,而且都是乘法的。

【讨论】:

    猜你喜欢
    • 2017-09-01
    • 2011-05-19
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 2015-04-07
    • 2015-07-01
    • 2013-10-17
    相关资源
    最近更新 更多