【问题标题】:Fast method of tile fitting/arranging快速安装/排列瓷砖的方法
【发布时间】:2015-02-27 05:16:17
【问题描述】:

例如,假设我们有一个有界的 2D 网格,我们希望用相同大小的方形图块覆盖该网格。我们有无限数量的瓷砖,它们属于定义数量的类型。每种类型的瓷砖都指定了印在该瓷砖上的字母。字母印在每个边缘旁边,只有在相邻边缘上具有匹配字母的瓷砖才能在网格上彼此相邻放置。瓷砖可以旋转。

鉴于网格的大小和图块类型定义,排列图块以满足上述约束并覆盖整个/大部分网格的最快方法是什么? 请注意,我的用例适用于大型网格(每个维度约 20 个)和中等数量的解决方案(与 Eternity II 不同)。

到目前为止,我已经尝试了从中心开始的 DFS,并在填充区域周围选择允许最少可能性的位置,并在没有进展的情况下回溯。这仅适用于具有一种或两种类型的简单场景。任何更多和太多的回溯随之而来。

这是一个简单的例子,显示输入和最终输出:

【问题讨论】:

  • 能否介绍一下约束条件、网格大小?瓷砖类型的数量?
  • 我认为所有这些都是问题的输入。尽管如果您可以正式定义输入(大小为A*BN 类型的图块、M 不同的字母、任何其他...?)那会很好。此外,瓷砖的 4 个边缘之间是否有重复,或者所有 4 个总是不同的字母? (将这些问题的任何答案添加到 OP)。
  • 是的,这些实际上是输入。此外,是的,允许重复,例如,瓷砖可能在所有边缘上都有字母 v。如果它是唯一的瓷砖类型,排列它们将是微不足道的。
  • 请举例说明您的问题。最好能理解并回答您的问题。

标签: algorithm search depth-first-search


【解决方案1】:

这是一个难题。

Eternity 2 是这种形式的拼图,具有 16 x 16 的方格。

尽管获得了 200 万美元的奖金,但几年来没有人找到解决方案。

论文"Jigsaw Puzzles, Edge Matching, and Polyomino Packing: Connections and Complexity" by Erik D. Demaine, Martin L. Demaine 表明这种类型的谜题是NP-完全的。

【讨论】:

    【解决方案2】:

    考虑到这种方形网格的问题,我会尝试对所有可能的列进行强力列表,然后对所有行进行动态编程解决方案。这将找到解决方案的数量,并且可以使用一些额外的工作来生成所有解决方案。

    但是,如果您的行是 n 长并且有 m 字母和 k 瓷砖,那么所有可能列的蛮力列表最多有 m<sup>n</sup> 可能的右边缘和最多 m<sup>4k</sup> 组合/旋转生成它所需的瓷砖。然后从一列的右边缘到下一列的右边缘的转换可能具有多达m<sup>2n</sup> 的可能性。这些数字通常不是最坏的情况,但这些数据结构的大小将是该技术可行性的上限。

    当然,如果这些数据结构变得太大而无法实现,那么您所描述的递归算法将太慢而无法枚举所有解决方案。但是如果有足够的,即使这种方法不可行,它仍然可能运行得可以接受。

    当然,如果您的行多于列,您会希望在此技术中颠倒行和列的角色。

    【讨论】:

    • 经过一点实验,似乎这个解决方案在解决方案数量较少的情况下效果最好。否则,例如,两个磁贴“1111”和“2221”(以及它们的所有旋转)的列大小为 15,会产生 350 万个不同的列。我的用例是针对大量解决方案和大型网格。
    • 对。这保证找到所有解决方案。但如果有很多,那么随机寻找一个可能会更有效。
    猜你喜欢
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多