在 this earlier question 中,OP询问了以下问题:
给定一个矩形网格,其中一些正方形是空的,有些正方形被填充,可以放入世界的2x1多米诺骨牌的最大数量是多少,这样两个多米诺骨牌没有重叠,没有多米诺骨牌位于填充的正方形上面?
这个问题的答案(非常漂亮!)认识到这相当于在特殊构造的图中找到最大的二分匹配。在此图中,每个空方块都有一个节点,该节点通过边链接到每个邻居。然后,每个多米诺骨牌对应于图中的边缘,使得其端点不被任何其他边缘覆盖。因此,不共享顶点(匹配)的任何边集都对应于多米诺骨牌的排列,反之亦然。
我的问题是对前一个问题的概括:
给定一个矩形网格,其中一些正方形是空的而一些正方形被填充,可以放入世界的M x N多米诺骨牌(对于给定的M和N)的最大数量是多少,因此没有两个多米诺重叠并且没有多米诺在一个充满广场的地方?
我无法看到如何将此转换为匹配问题,如前一种情况所做的那样。但是,我也没有看到为什么这个问题会立即成为NP难的特殊原因,因此可能有一个多项式时间解决问题。
是否有解决此问题的有效算法?或者是否有人有减少表明这个问题是NP难的?
非常感谢!
答案 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
强制从外部覆盖X
和Y
中的一个。用于链接变量及其否定。
Y***
*
*
ooo ****
* * * *
* * * *
X **** Z
强制从外部覆盖X
和Y
以及Z
中的任何一个或全部。用于复制X
或销毁同一件事的三个副本。使用长度为3 L的碎片可以或多或少地任意塑造导线。
*******************
* * *
* * *
X Y Z
强制从外部覆盖X
和Y
以及Z
中的一个。每个条款一个。
答案 4 :(得分:0)
我要做的第一件事就是建立第三种状态:“空洞,但无法到达”。您可以很容易地证明每个瓷砖在l * w * m * n时间内无法到达(其中l是世界的长度,w是世界的宽度,m和n是瓷砖的尺寸)。这将减少您的空间,以便可以访问任何空的图块。请注意,您可能拥有可到达的磁贴岛。最简单的例子是世界减少了一半。这有助于递归努力,每个可达性岛都被视为一个世界本身。
现在我们正在处理一个岛屿(可能是或可能不是正方形)你基本上有一个特殊情况的2D背包问题,这个问题已知为NP-hard ({ {3}}在以前的工作中)。您通过在背包中添加始终填充的固定位置来增加问题的复杂性,但通过使所有包装具有相同的尺寸来降低复杂性(略微)。