Java 用不规则形状填充网格

Java 用不规则形状填充网格,java,algorithm,Java,Algorithm,我希望建立一个算法来确定有多少种不同的方法可以用12个类似俄罗斯方块的特定片段填充6x10网格 所有部件均由五块组成,可自由镜像和旋转。它们必须全部符合网格(无重叠),并且不应留下任何空间 此外,如果一个排列不是以前存在的排列的镜像或旋转图像,则该排列仅被视为是不同的 我选择给每个旋转步骤赋予它自己的矩阵,T形块的表示如下所示: [ 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0,

我希望建立一个算法来确定有多少种不同的方法可以用12个类似俄罗斯方块的特定片段填充6x10网格

所有部件均由五块组成,可自由镜像和旋转。它们必须全部符合网格(无重叠),并且不应留下任何空间

此外,如果一个排列不是以前存在的排列的镜像或旋转图像,则该排列仅被视为是不同的

我选择给每个旋转步骤赋予它自己的矩阵,T形块的表示如下所示:

[
    0, 0, 0, 0, 0,
    0, 1, 1, 1, 0,
    0, 0, 1, 0, 0,
    0, 0, 1, 0, 0,
    0, 0, 0, 0, 0
],
[
    0, 0, 1, 0, 0,
    0, 0, 1, 1, 1,
    0, 0, 1, 0, 0,
    0, 0, 0, 0, 0,
    0, 0, 0, 0, 0
],
[
    0, 0, 1, 0, 0,
    0, 0, 1, 0, 0,
    0, 1, 1, 1, 0,
    0, 0, 0, 0, 0,
    0, 0, 0, 0, 0
],
[
    0, 0, 0, 1, 0,
    0, 1, 1, 1, 0,
    0, 0, 0, 1, 0,
    0, 0, 0, 0, 0,
    0, 0, 0, 0, 0
]
我最初的方法是暴力;试着从一个形状开始,然后试着从左上角开始,一个接一个地把所有其他的部分都装进去


然而,我很好奇是否有人有更好的方法来解决这个问题?

我相信,一般来说,你只能使用暴力,除非你有特定的情况(例如,所有的碎片都是2x2立方体)。不过,您可以使用一些技巧:

  • 如果只有一个“S”形,您可以在不丧失一般性的情况下假设它位于左上象限,并将结果乘以4,再加上可能位于轴上的一些情况

  • “拿起一块瓷砖并递归地尝试所有位置”的执行方式可能不同于“拿起第一个可用位置并尝试覆盖它的所有可能的瓷砖配合”

  • 如果有一个不能被4整除的洞,你可以打破

  • 如果存在漏洞,您可以拆分计算(填充所有内容的方式数=填充漏洞的方式数*填充其余内容的方式数)


也许还有更多。

你对pentominos做过研究吗?因为这就是我的出发点——我在搜索引擎上输入这个词,然后开始。你的形状不是不规则的,而是非常规则的。如果你找到一张小纸Donald E.Knuth。“舞蹈链接”(Postscript,1.6兆字节)。包括斯科特和弗莱彻的文章摘要。()他说他已经开发了一些程序——也许你可以把它们转换成java。然后你可以在这里展示,我们可以开始讨论,因为这主要是一个编程论坛。