【发布时间】: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