用未知形状填充网格

Filling a grid with unknown shapes

作为输入,我给出了 0 的 2D 网格,其中几个 -1 位置表示无法填充的位置和某些形状的蓝图(如俄罗斯方块游戏)

 ex. of grid              ex. of shapes

 0  0  0  0  0  0  0        1 1 1     2 2 2     3 3
-1  0  0  0  0  0  0        1           2
-1  0  0  0  0  0  0        1
 0  0  0  0  0 -1  0
 0  0  0 -1  0  0  0

算法应该输出 填充给定形状的网格总是必须使用所有形状一次 我可以旋转形状,我应该总是得到可以填充的网格和形状。 我研究了像洪水填充算法这样的算法,但我并没有真正看到在这里使用它的方法。是否有可能以不同于暴力破解的方式来做到这一点?

这是我对如何解决这个问题的想法:

每种形状似乎有 4 种可能的类型(包括原始形状) 例如:

1 1 1          1    1 1 1    1
1       ->     1        1    1
1          1 1 1,       1,   1 1 1 

现在假设有 s 个形状,那么总共有 4s 个形状。

4s 个形状中组合出一个像这样的图形:

  2
1 2 2
1 2 3 3
1 1 1 

1 1 1
1 2 3 3
1 2 2
  2 

1 1 1 3 3
1 2 2 2
1   2

(4s)^2 = 16s^2 种可能性中的任何此类数字。

其实不止16s^2,因为不是简单的形状拼接,需要贪婪地寻找空位,尽量塞进去。 :(

现在你手里有了一个图形,在你的网格中寻找相同的形状。

例如要查找

1 1 1
1 2 3 3
1 2 2
  2 

我会寻找

0 0 0
0 0 0 0
0 0 0
  0 

在原来的格子里。

那么这好像是在原矩阵中求那个图的问题

另请参阅 this,这是一个关于查找形状的类似但不完全相同的问题。