平铺算法

Tiling Algorithm

我遇到了一个必须解决难题的问题。

例如我有一个 20x20(例如米)的(可变)区域。有许多具有可变尺寸的给定布景。例如 4x3、4x2、1x5 件等。这些件也可以转动以增加我的问题的痛苦。拼图的重点是用给定的棋子填满整个 20x20 的区域。

要实现这样的壮举,什么是好的起始算法? 我正在考虑使用计算开放 space 的启发式方法(出于效率目的)。

提前致谢

那是一个 Exact Cover problem,结构也很好,通常,取决于作品。我不知道任何启发式算法,但有几个确切的选项应该运行良好。

与 Exact Covers 一样,您可以有效地使用 Dancing Links, a way to implement Algorithm X

一般情况下,您可以使用零抑制决策图解决此问题。但这取决于瓷砖。作为奖励,您可以表示所有可能的解决方案并对它们进行计数或生成一个具有某些属性的解决方案,所有这些都无需显式存储整个(通常太大)解决方案集。

BDDs 也可以工作,使用更多的节点来完成同样的事情(因为解决方案非常稀疏,例如,使用很少的可能的瓷砖放置 - ZDDs 就像这样,但 BDDs 更喜欢对称而不是稀疏).

或者您可以将其转化为 SAT 问题,然后您获得的信息较少(例如,没有解决方案计数),但如果有简单的解决方案,则速度会更快。