【发布时间】:2017-01-02 21:15:03
【问题描述】:
用多米诺骨牌将棋盘部分平铺是指在棋盘上放置多米诺骨牌,使得没有两个多米诺骨牌重叠。用多米诺骨牌拼贴棋盘是一种局部拼贴,其中棋盘的每个方格都被一些多米诺骨牌覆盖。
我感兴趣的问题如下:$N$×$N$ 棋盘由多米诺骨牌组成的平铺数是多少?
事实证明,$M$ 与 $N$ 棋盘 b 多米诺骨牌的平铺数量实际上有一个明确的公式:
https://wikimedia.org/api/rest_v1/media/math/render/svg/1bc328b90d68fd765e2666ad0c62bb42b2e2bd10
我对解决此问题的算法方法感兴趣。我们只需要考虑 $N$ 偶数的情况(对于 $N$ 奇数,平铺的数量显然是 $0$)。我想解决的唯一算法是蛮力递归。
我创建了一个名为 number_of_tilings(partial_tiling) 的函数,该函数接受棋盘的部分平铺,并输出用多米诺骨牌覆盖未覆盖方格的方式数,以便我们最终得到一个平铺。
我创建了一个名为uncovered_square(partial_tiling) 的辅助函数,它接受部分平铺并输出平铺中最左上角的未覆盖正方形,如果不存在这样的正方形,则输出False。
函数number_of_tilings(partial_tiling)是递归定义的:如果uncovered_square(partial_tiling)输出False,那么number_of_tilings(partial_tiling)=1,因为partial_tiling实际上是一个合适的平铺。否则,uncovered_square(partial_tiling) 输出一些正方形 S。我们在正方形 S 上水平放置一个多米诺骨牌(如果可能),从而生成一个新的部分平铺 t_horizontal。同样,我们定义 t_vertical。最后我们计算number_of_tilings(t_horizontal)+number_of_tilings(t_vertical)。
number_of_tilings 的初始输入是一个 $N$ x $N$ 棋盘,上面没有放置多米诺骨牌。
对于 N=2,4,6,该算法非常快地给出正确答案,但对于 N>=8,它非常慢(超指数时间)。
所以我的问题是存在哪些其他可能的算法,或者可以优化蛮力算法吗?
【问题讨论】:
-
你在哪里找到这个公式的?有一个 P 时间算法可以做到这一点。见en.wikipedia.org/wiki/FKT_algorithm,但关于这种特殊情况的优雅算法的存在,我不知道。
标签: algorithm