我有一块36 x 36英寸宽和高的瓷砖。
所以我有块8x8,6x6,6x8,4x8,可以旋转90度来适应任何可能的地方。
我的任务是制作一个应用程序,计算应该选择哪些块和多少块,以便所有块都适合给定的墙。在本例中,Oppening为36 x 36。
注:对立面应尽量少填瓷砖,即较大的瓷砖优先。
我应该使用哪种算法来放置瓷砖?
另一个例子。字段30 x 30的绘制方式如下:
50 x 50个

最佳答案

既然阿米特给出了general case answer,我就把这一个具体化。对于这四个块的大小,并且假设它是偶数可能的(维度是偶数且>=6等),您可以使用半贪婪算法:
第一个目标是最大化8x8块的数量。要做到这一点,您需要计算出每个方向上需要多少个6大小的块。对于每个维度,只需检查8的可除性。如果不可除,减去6。重复直到可除(不应超过3次)。
不管花了多少次,这就是您在该维度中需要的6x6块的方式。把它们做成一个长方形放在一个角落里。从8x8块中形成另一个矩形,并将它们放在另一个角上。这两个矩形的角应该接触。
所以现在你可能有一些剩余的空间,在对角的两个矩形的形式。我们知道每个维度的一个维度可以被8整除,一个维度可以被6整除。这里的简单方法是用6x8块适当地旋转,但不能保证最大(8x8)块的最大数量。例如,对于50x50,您将有两个18x32的矩形。你可以用12块6x8的瓷砖把它们填满你甚至不能做超过12块每,但你可以在那里容纳更多的8x8块。
如果这不是问题,那你就完了(万岁)这样做的好处是你永远不需要使用4x8街区。
如果你真的想最大化8x8块,你就得再走一步。我们把注意力集中在能被6整除的维度上,因为8很容易。我们可能需要的每种尺寸(8x8、6x8、4x8)的堆栈都非常完美。
另一方面,可能只有3个数字:6、12和18如果是别的,第一步就做得不对。然后采取以下措施:
对于6,添加一行6x8(无优化)
对于12,添加一行4x8和一行8x8
对于18,添加一行4x8、一行6x8、一行8x8
完成!
为了看出区别,这里有两个50x50网格:

Blue  - 8x8
Red   - 6x6
Green - 6x8
Gray  - 4x8

第一个例子给出了总共49个块。蓝色是一个32x32的区域(16个街区),红色是18x18(9个街区),其余的是简单的6x8(24个街区)。
这个例子仍然给出了总共49个,但是还有更多的8x8块。这里我们有24个大区块,而不是上一个例子中的16个。现在也有4x8块正在使用。

09-07 19:27