作为输入,我给出了0的2D网格,几乎没有-1个位置,这些网格指示无法填充的位置和某些形状的蓝图(例如在Tetris游戏中)
Forecast.select(Arel.sql("week(datum)+1 as kw, year(datum) as jahr, count(*) as anzahl, sum(dv) as dv")).group(Arel.sql('kw, jahr')).order(Arel.sql('jahr, kw'))
算法应输出 充满给定形状的网格始终必须使用所有形状一次 我可以旋转形状,并且应该始终给我可以填充的网格和形状。 我研究了像洪水填充算法这样的算法,但在这里我真的看不到使用它的方法。是否有可能通过暴力破解来实现?
答案 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,这是关于查找形状的类似问题,但并不完全相同。