Algorithm 推广domino平铺算法?
在中,OP询问了以下问题: 给定一个矩形网格,其中一些正方形是空的,一些是填充的,那么可以放置到世界上的最大数量的2x1多米诺骨牌是多少,这样就不会有两个多米诺骨牌重叠,也不会有多米诺骨牌在填充的正方形上 这个问题的答案(相当漂亮!)承认这相当于在一个特殊构造的图中找到一个最大二部匹配。在该图中,每个空正方形都有一个节点,该节点通过一条边链接到其每个邻居。然后,每个domino对应于图中的一条边,这样它的端点就不会被任何其他边覆盖。因此,任何不共享顶点的边集(匹配)都对应于多米诺骨牌的排列,反之亦然 我的问题是对前一个问题的概括: 给定一个矩形网格,其中一些正方形是空的,一些是填充的,那么最大数量的M x N多米诺骨牌(对于给定的M和N)可以放置在世界上,这样就不会有两个多米诺骨牌重叠,也不会有多米诺骨牌在填充的正方形上 我看不出如何将其转换为与前一个案例相同的匹配问题。然而,我也不明白为什么这个问题会立即成为NP难问题,所以可能有一个多项式时间的解决方案 有解决这个问题的有效算法吗?或者有没有人能证明这个问题是NP难的Algorithm 推广domino平铺算法?,algorithm,puzzle,tiling,Algorithm,Puzzle,Tiling,在中,OP询问了以下问题: 给定一个矩形网格,其中一些正方形是空的,一些是填充的,那么可以放置到世界上的最大数量的2x1多米诺骨牌是多少,这样就不会有两个多米诺骨牌重叠,也不会有多米诺骨牌在填充的正方形上 这个问题的答案(相当漂亮!)承认这相当于在一个特殊构造的图中找到一个最大二部匹配。在该图中,每个空正方形都有一个节点,该节点通过一条边链接到其每个邻居。然后,每个domino对应于图中的一条边,这样它的端点就不会被任何其他边覆盖。因此,任何不共享顶点的边集(匹配)都对应于多米诺骨牌的排列,反之
非常感谢 真是个好问题。这个问题相当于在一个特殊的图上找到最大独立集(或最大团大小)-顶点将是MxN矩形的所有可能位置,如果它们发生碰撞,边将连接两个位置。然后求出最大独立集的大小就得到了结果。反之亦然,我们可以将边定义为连接两个不碰撞的位置,然后我们将寻找最大团大小。无论如何,这两个图既不是无爪图也不是完美图,所以我们不能用多项式解来寻找最大独立集/团
因此,我们可以尝试将最大独立集问题转换为这个平铺问题,但我找不到一种方法如何将一般图转换为这个,因为你无法将例如诱导的K1,5子图转换为平铺。1x3平铺很难从三次平面单调还原。我们必须建立一些“电路”来对公式进行编码 “大门”:
强制外部覆盖
X
和Y
中的一个。用于链接变量及其否定
强制外部覆盖
X
和Y
和Z
中的任何一个或全部。用于复制X
或销毁同一事物的三个副本。使用长度为3 L的金属片,金属丝或多或少可以任意成形
强制外部覆盖
X
和Y
和Z
中的一个。每个子句对应一个。我要做的第一件事是设置第三个状态:“空,但不可访问”。您可以很容易地证明在l*w*m*n时间内无法到达每个磁贴(其中l是世界的长度,w是世界的宽度,m和n是磁贴的尺寸)。这将减少您的空间,以便可以访问任何空磁贴。请注意,您可能有可访问的磁贴孤岛。最简单的例子就是世界被一分为二。这有助于递归工作,其中每个可达性岛都被视为自身的世界
现在我们正在处理一个岛(可能是方形的,也可能不是方形的),你基本上有一个2D背包问题的特例,这个问题被称为NP难问题(在之前的工作中)。你的问题增加了问题的复杂性,因为你在背包中添加了固定的位置,而背包总是装满的,但通过使所有包裹大小相同,问题的复杂性(稍微)降低了。这个问题肯定是NP难问题,我可以证明这一点。从3-SAT减少到这个问题。具体来说,它是从3-SAT减少到这个问题的子问题,其中多米诺骨牌是1x3。对于其他特定的尺寸,也可能会有其他的减少,但这一个肯定有效 本质上,在这个简化中,我们将使用domino位置来编码true或false。具体来说,我将采用与另一个解决方案相同的符号,也就是说,我将使用星号来表示网格上的开放空间。我还将使用一组三个大写字母来表示多米诺骨牌,并使用小写字母来表示“信号”,这些信号是根据系统的状态可以填充也可以不填充的空间 为了将一个3-SAT问题嵌入到这个空间中,我们需要一组我称之为小工具的东西,这些小工具只允许某些状态成为可能。这些小玩意中的大多数都有固定数量的多米诺骨牌。例外情况是那些表示子句的gadget,如果子句为true(已满足),则它们将有一个额外的domino,但如果子句为false(未满足),则不会。我们可以使用路径连接这些小工具。这将使我们能够建立一个3-SAT电路。我们将有一个基本的多米诺骨牌数量,因为每个路径和小工具都会有一个标准数量的多米诺骨牌,我们可以把这些加起来得到一个基本的数字k,然后每个子句小工具可以有一个额外的多米诺骨牌,如果它是真的,那么如果所有子句都可以变为真(因此表达式满足),并且有n个子句,那么多米诺骨牌的最大数量将是n+k。如果不是,则最大数量将小于n+k。这是还原的基本形式。接下来,我将描述这些小工具并给出示例 与另一个答案类似,我们将有两个位置,对给定变量编码true和false。因此,我将从一块瓷砖开始,它可以位于两个可能的位置
****
这可以是
Y***
*
*
ooo ****
* * * *
* * * *
X **** Z
*******************
* * *
* * *
X Y Z
****
AAA* or *AAA
x**y
x*****y
***y
*
*
x
***y
*
**x
BBB* ABBB
* A
AAA *AX
*x*y*
*
z
* *
* *
* *
*****
*
****
A B
C D
C D
*C*D*
*
EEEF
C B A D A B
C D C D C D
C D or C D or C D
GGGD* *CGGG *CGD*
* * G
EEEF EEEF GEEE
C D
C D
C D
*****
*
*EEE
y*** ***z
* *
***
***
x
yAAA BBBz
C D
CED
CED
E
AAAC DBBB
C D
C*D
EEE
X
*******
* *
* *
**** ***
* *
*** ****
* *
* *
* ******* *
* * * *
* * * *
*z*x* *****
* *
**** ****
* *
***
***
*
*
*
y
QRRRSSS
Q T
Q T
OPPP *UT
O U
*ON UVVV
N W
N W
M IIIJJJK W
M H K X
M H K X
*zGH* LLLX*
G *
GEEE FFF*
B D
BCD
BCD
C
A
A
A
***c
*
***
* *
* *
* *
***
***
ax*yb
(tt) AAAc (ft) AAAc (tf) AAAc (ff) BAAA
* * * B
BBB BBB BBB CBD
C D C D C D C D
C D C D C D C D
C D C D C D E G
EEE EEE EEE EFG
FFF FFF FFF EFG
aGGGb aXGGG GGGYb aXFYb
****
*
x*y
BBB* ABBB ABBB ABBB
* A A A
AAA XAy xAY XAY
******* ****
* * * *
* *** *
*** *** ***
* * *
**** * ****
* * *
* **** *
*** * ***
* *** *
**** * * ****
y * * * * x
* * * * * *
* **** *** **** *
*** *** ***
**********x*y*************
y*** ***z AAAC DBBB
* * C D
*** C*D
*** EEE
*x* FFF
y*** ***z
* *
***
***
*x*