平铺网格有2 x 1和2 x 2矩形

时间:2013-01-12 17:13:45

标签: algorithm dynamic-programming tiling recurrence

我无法将递归关系写成如下问题。

给定一个尺寸为4 x n的矩形网格,有多少种方法可以用2 x 2和2 x 1多米诺骨牌完全平铺网格?

这里对于2 x 1矩形它做得很好,但我无法弄清楚矩形是2 x 1和2 x 2:http://www.acmgnyr.org/year2007/h.c

有什么想法吗?

例如

4x1:1路

4x2:11种方式

4x3:29种方式

下面的代码使用暴力生成所有可能性。但我想用动态编程来做到这一点。

https://gist.github.com/4519601

2 个答案:

答案 0 :(得分:2)

我认为你可以通过使用动态编程算法来解决这个问题。

想象一下,将网格表示为不是4 x n的正方形网格,而是表示每个单独列的宽度的4元组。每次放置瓷砖时,您都可以尝试将其放置在某个位置,使其中一个正方形触及网格最左侧的左上角。这样做的效果是改变每列的有效宽度。例如,给定这个4 x 3网格:

. . .
. . .
. . .
. . .

我们将其编码为(3,3,3,3)。如果你要在上角放置一个2 x 2的块,你会得到这个:

X X .
X X .
. . .
. . .

这将被编码为(1,1,3,3),因为前两行现在实际上要小得多。

这表明初始(低效)递归算法。作为基本案例,世界(0,0,0,0)只有一个解决方案(即什么都不做)。任何没有合法方法放置覆盖最左边行最顶部方块的瓷砖的世界都没有解决方案。否则,对于所有可能的移动,进行移动,更新世界的内部表示,并递归地添加您可以在较小的世界中找到的所有解决方案。

这非常缓慢(呈指数级),但可以大大加快。特别要注意的是,可能的4元组的数量是(n + 1) 4 。这意味着唯一递归调用的最大数量为O(n 4 )。因此,如果您记住递归调用或使用动态编程来向后计算调用,则只需进行多项式调用。记忆应该很容易添加到现有的递归解决方案中,并且加速应该非常大。

如果您正在寻找解决此问题的更加数学上精确的方法,请考虑尝试为此问题编写生成函数,并使用它来派生封闭形式的解决方案。一旦掌握了这一点,就不应该比上述解决方案更有效地直接评估它。既然我不是生成函数的专家,我真的不确定你是怎么做的。

希望这有帮助!

答案 1 :(得分:0)

4xn中,n是偶数或奇数。如果n是偶数,只需使用2x2多米诺骨牌。否则,请使用2x2最多n-1。然后使用两个2x1多米诺骨牌来完成4x1剩余的块。在回答时,我没有按照您的链接进行操作,因为我认为问题已经充分陈述,链接只是您对更简单问题的回答。

n =偶数

use n 2x2 dominoes

n =奇数

use n-1 2x2 dominoes plus 2 2x1 domino
  • 如果n = 10则4 * 10 = 40且(2x2)* 10 = 40

  • 如果n = 11,那么4 * 11 = 44和(2x2)* 10 = 40和(2x1)* 2 = 4,总共44