推广多米诺骨牌拼贴算法?

时间:2011-09-08 02:03:17

标签: algorithm puzzle tiling

this earlier question 中,OP询问了以下问题:

  

给定一个矩形网格,其中一些正方形是空的,有些正方形被填充,可以放入世界的2x1多米诺骨牌的最大数量是多少,这样两个多米诺骨牌没有重叠,没有多米诺骨牌位于填充的正方形上面?

这个问题的答案(非常漂亮!)认识到这相当于在特殊构造的图中找到最大的二分匹配。在此图中,每个空方块都有一个节点,该节点通过边链接到每个邻居。然后,每个多米诺骨牌对应于图中的边缘,使得其端点不被任何其他边缘覆盖。因此,不共享顶点(匹配)的任何边集都对应于多米诺骨牌的排列,反之亦然。

我的问题是对前一个问题的概括:

  

给定一个矩形网格,其中一些正方形是空的而一些正方形被填充,可以放入世界的M x N多米诺骨牌(对于给定的M和N)的最大数量是多少,因此没有两个多米诺重叠并且没有多米诺在一个充满广场的地方?

我无法看到如何将此转换为匹配问题,如前一种情况所做的那样。但是,我也没有看到为什么这个问题会立即成为NP难的特殊原因,因此可能有一个多项式时间解决问题。

是否有解决此问题的有效算法?或者是否有人有减少表明这个问题是NP难的?

非常感谢!

5 个答案:

答案 0 :(得分:18)

答案 1 :(得分:2)

致基思:

出色的工作和很棒的解释!虽然,我写了一个程序,找到最大的倾斜,并发现了一个缺陷。希望这可以修复! [更新:Keith解决了这个问题!]

请查看此链接: http://pastebin.com/bABQmfyX(分析了您的小工具,以及非常方便的c ++源代码)

问题是下面的小工具可以平铺6个多米诺骨牌:

y*** ***z
   * *
   ***
   ***
   *x*

-Tom Sirgedas

答案 2 :(得分:0)

真是个好问题。这个问题相当于在特殊图上找到最大独立集大小(或最大集团大小) - 顶点将是MxN矩形的所有可能位置,如果它们发生碰撞,边将连接这两个位置。然后找到最大独立集的大小得到结果。反之亦然,我们可以将边缘定义为连接两个不会发生碰撞的位置,然后我们会寻找最大的团体大小。无论如何,这两个图既不是无爪也不完美,所以我们不能使用多项式解来找到最大的独立集/ clique。

因此,我们可以尝试将最大独立集问题转换为此平铺问题,但我找不到如何将常规图转换为此方法,因为您无法转换,例如诱导K 1,5 子图到瓷砖。

答案 3 :(得分:0)

1x3瓷砖通过从立方平面单调One-in-three 3SAT减少而变硬。我们必须建立一些“电路”来编码公式。

“门”:


X********Y

强制从外部覆盖XY中的一个。用于链接变量及其否定。


Y***
   *
   *
  ooo  ****
  * *  *  *
  * *  *  *
  X ****  Z

强制从外部覆盖XY以及Z中的任何一个或全部。用于复制X或销毁同一件事的三个副本。使用长度为3 L的碎片可以或多或少地任意塑造导线。


*******************
*        *        *
*        *        *
X        Y        Z

强制从外部覆盖XY以及Z中的一个。每个条款一个。

答案 4 :(得分:0)

我要做的第一件事就是建立第三种状态:“空洞,但无法到达”。您可以很容易地证明每个瓷砖在l * w * m * n时间内无法到达(其中l是世界的长度,w是世界的宽度,m和n是瓷砖的尺寸)。这将减少您的空间,以便可以访问任何空的图块。请注意,您可能拥有可到达的磁贴岛。最简单的例子是世界减少了一半。这有助于递归努力,每个可达性岛都被视为一个世界本身。

现在我们正在处理一个岛屿(可能是或可能不是正方形)你基本上有一个特殊情况的2D背包问题,这个问题已知为NP-hard ({ {3}}在以前的工作中)。您通过在背包中添加始终填充的固定位置来增加问题的复杂性,但通过使所有包装具有相同的尺寸来降低复杂性(略微)。