- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
多米诺骨牌对棋盘的部分平铺是将多米诺骨牌放置在棋盘上,使得没有两个多米诺骨牌重叠。多米诺骨牌平铺棋盘是一种部分平铺,其中棋盘的每个方格都被一些多米诺骨牌覆盖。
我感兴趣的问题如下:多米诺骨牌的 $N$ 乘 $N$ 棋盘的平铺数是多少?
事实证明,$M$ 乘 $N$ 棋盘 b 多米诺骨牌的拼贴数实际上有一个明确的公式:
https://wikimedia.org/api/rest_v1/media/math/render/svg/1bc328b90d68fd765e2666ad0c62bb42b2e2bd10
我对这个问题的算法方法很感兴趣。我们只需要考虑 $N$ 偶数的情况(对于 $N$ 奇数,平铺的数量显然是 $0$)。我想到要解决的唯一算法是蛮力递归。
我创建了一个名为 number_of_tilings(partial_tiling) 的函数,它接受棋盘的部分平铺并输出用多米诺骨牌覆盖未覆盖方 block 的方法数量,这样我们最终得到一个平铺。
我创建了一个名为 uncovered_square(partial_tiling) 的辅助函数,它接受部分平铺并输出平铺中最左上角未覆盖的方 block ,如果不存在这样的方 block ,则输出 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 则非常慢(超指数时间)。
所以我的问题是还有哪些其他可能的算法存在或者可以优化暴力算法?
最佳答案
有一个非常简单的动态规划解决方案,运行时间复杂度为 O(N*2^2N) 或更短:
生成所有可能的填充第一行的方法(小于 2^N)。
由于多米诺骨牌只有 2 个方格长,因此其效果只会传播到第二行。第二行的可能配置少于 2^N 种。计算每一种有多少种生成方式。
类似地,通过填充前两行产生第三行的 <= 2^N 种配置,依此类推。给定通过填充前 m 行剩余的生成每个配置的方法数,您可以计算在 O(2^2N) 或更短时间内通过填充前 m+1 行剩余的生成每个配置的方法数。
对于通过填充前 N-1 行生成的每个配置,最多可以有 1 种方法来填充最后一行。将生成每个配置的方法数加起来,在最后一行只留下偶数长度的间隙,这就是您的答案。
在一个代码紧凑的好盒子上,我希望 N=16 时这需要不到一分钟的时间。我可以想出很多方法来让它更快一点,但没有什么能在 O(2^N) 之下
关于algorithm - 关于多米诺骨牌棋盘的平铺数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41433365/
我正在尝试制作一种能够解决拼贴问题中的大图 block 集的算法。现在它能够根据宽度和高度找到正确的 Tiles 来放置,但是在使其正确递归方面存在一些问题。 如您所见,这个想法是,在放置的每个图 b
有什么方法可以轻松地平铺 mdi parent 的所有表单 child 吗?我正在寻找 windows 提供的大部分功能,瓷砖级联。有谁知道一个简单的方法? 最佳答案 试试这些... // Tile
我有一个大 jpg,其分辨率为 x * 256/x * 256。我想将此图像切割为 256x256 的图块,命名约定为 {zoom}-{x}-{y}.jpg。过去我使用 ZoomifyExpress
如何使用ImageMagick平铺图像?我认为我不能使用montage,因为我希望将列偏移原始图像高度的50%。 展示我正在尝试做的事可能更容易: 从...开始: 结尾为: 谢谢! 最佳答案 感谢Fr
是否可以在 XNA 中平铺图像以使其填满整个矩形?我试过用谷歌搜索这个主题,但我找不到任何似乎有用的东西(虽然我可能遗漏了一些明显的东西)。我找到了 this MSDN page ,但我似乎无法让它工
我无法找到答案,为什么我为图 block map 制作的图 block 表在使用 libGDX 在屏幕上移动时会创建垂直白线和不稳定的水平线。 这是显示白色垂直线的视频:https://www.you
有谁知道 GitHub Java version of Tiled 中如何临时支持视差图层吗?工作正常吗? 它可以编译,并且执行得很好。但是,如果我将图层设置为viewplane distance 0
在我制作的平台游戏中,我需要加载图 block 才能创建关卡,但在下面的代码中我似乎遇到了问题。它说我在这部分有一个错误: String[] skips = skip.split(" "); 但对我来
使用 pdfimages 提取图像和 mupdf/mutool到目前为止工作正常。 使用 FreePDF 生成的 PDF 中的图像总是被切片,因此一个图像会生成多个图像文件。 有什么技巧可以避免这种情
我正在尝试使用 Tiled 编写基于 rts-like-tile 的游戏和 slick2d。 我不知道如何处理多图 block 对象,例如建筑物,如何创建、保存等等。移动它们。 最佳答案 一种解决方案
我想用一张图片来编写一个平铺 map 。它应该是一个 5x5 的小图片区域。我写了一些带有 2 个嵌套循环的 Javascript 代码。使用此解决方案,仅打印 1 张图片。当我在第二个循环中删除 b
我正在尝试使用 Slick2D 和 Tiled Map Editor 制作一个基本的 2D 游戏。我已经弄清楚如何使用 TileProperties 进行基本的碰撞检测,但我不确定对象如何与 map
我正在尝试创建一个无限滚动的分页 UIScrollView 我一直在关注 Advanced UIScrollView Techniques来自 WWDC 2010 的视频,但是我不确定如何为分页 UI
好吧,假设我有一个像本网站一样的冷却平铺背景。 http://www.leeslights.com/colors-shapes-sizes-and-prices.html 我将如何使图像平铺到浏览器,
这个问题在这里已经有了答案: CSS-only masonry layout (5 个答案) 关闭 2 年前。
这个问题在这里已经有了答案: CSS-only masonry layout (5 个答案) 关闭 2 年前。
这个问题在这里已经有了答案: CSS-only masonry layout (5 个答案) 关闭 2 年前。
这个问题在这里已经有了答案: CSS-only masonry layout (5 个答案) 关闭 2 年前。
这个问题在这里已经有了答案: CSS-only masonry layout (5 个答案) 关闭 2 年前。
这个问题在这里已经有了答案: CSS-only masonry layout (5 个答案) 关闭 2 年前。
我是一名优秀的程序员,十分优秀!