Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 推广domino平铺算法?_Algorithm_Puzzle_Tiling - Fatal编程技术网

Algorithm 推广domino平铺算法?

Algorithm 推广domino平铺算法?,algorithm,puzzle,tiling,Algorithm,Puzzle,Tiling,在中,OP询问了以下问题: 给定一个矩形网格,其中一些正方形是空的,一些是填充的,那么可以放置到世界上的最大数量的2x1多米诺骨牌是多少,这样就不会有两个多米诺骨牌重叠,也不会有多米诺骨牌在填充的正方形上 这个问题的答案(相当漂亮!)承认这相当于在一个特殊构造的图中找到一个最大二部匹配。在该图中,每个空正方形都有一个节点,该节点通过一条边链接到其每个邻居。然后,每个domino对应于图中的一条边,这样它的端点就不会被任何其他边覆盖。因此,任何不共享顶点的边集(匹配)都对应于多米诺骨牌的排列,反之

中,OP询问了以下问题:

给定一个矩形网格,其中一些正方形是空的,一些是填充的,那么可以放置到世界上的最大数量的2x1多米诺骨牌是多少,这样就不会有两个多米诺骨牌重叠,也不会有多米诺骨牌在填充的正方形上

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

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

给定一个矩形网格,其中一些正方形是空的,一些是填充的,那么最大数量的M x N多米诺骨牌(对于给定的M和N)可以放置在世界上,这样就不会有两个多米诺骨牌重叠,也不会有多米诺骨牌在填充的正方形上

我看不出如何将其转换为与前一个案例相同的匹配问题。然而,我也不明白为什么这个问题会立即成为NP难问题,所以可能有一个多项式时间的解决方案

有解决这个问题的有效算法吗?或者有没有人能证明这个问题是NP难的


非常感谢

真是个好问题。这个问题相当于在一个特殊的图上找到最大独立集(或最大团大小)-顶点将是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*