填充不规则形状的网格

时间:2017-01-12 16:59:49

标签: java algorithm

我希望建立一个算法来确定用12个特定的俄罗斯方块来填充6x10网格的不同方式。

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

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

我已经选择给每个旋转步骤它自己的矩阵,并且T-Block的表示将如下所示:

[
    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
]

我最初的做法是蛮力;尝试使用一个形状的每一个起始点,然后从左上角开始逐个尝试将所有其他部分放在它周围。

但是,如果有人能更好地解决这个问题,我很好奇吗?

1 个答案:

答案 0 :(得分:0)

我相信一般情况下你只能做蛮力,除非你有一些具体的情况(例如所有作品都是2x2立方体)。你可以使用一些技巧:

  • 如果只有一个" S"形状,你可以不失一般性,假设它在左上象限,并将结果乘以4,加上可能是某些情况,因为它在轴上;

  • "拿起瓷砖并递归尝试所有位置"可以执行不同于"拿起第一个可用位置并尝试覆盖它的所有可能的瓷砖配合&#34 ;;

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

  • 如果有一个洞,你可以分开计算(填充所有东西的方法数量=填补洞的方法数量*填补其余部分的方法数量);

也许还有一些。