我希望建立一个算法来确定用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
]
我最初的做法是蛮力;尝试使用一个形状的每一个起始点,然后从左上角开始逐个尝试将所有其他部分放在它周围。
但是,如果有人能更好地解决这个问题,我很好奇吗?
答案 0 :(得分:0)
我相信一般情况下你只能做蛮力,除非你有一些具体的情况(例如所有作品都是2x2立方体)。你可以使用一些技巧:
如果只有一个" S"形状,你可以不失一般性,假设它在左上象限,并将结果乘以4,加上可能是某些情况,因为它在轴上;
"拿起瓷砖并递归尝试所有位置"可以执行不同于"拿起第一个可用位置并尝试覆盖它的所有可能的瓷砖配合&#34 ;;
如果有一个大小不能被4整除的洞,你可以打破;
如果有一个洞,你可以分开计算(填充所有东西的方法数量=填补洞的方法数量*填补其余部分的方法数量);
也许还有一些。