我有一个矩形,宽度为x,高度为height,并且有N个相同大小的正方形。我必须确定这些正方形的最大尺寸以及行数和列数,使其完美地适合矩形(更新:我指的不是填满所有空间,而是尽可能填满空间)。
我猜数学上看起来是这样的:
x * size <= width //x - number of columns
y * size <= height //y - number of rows
x * y <= N //N - number of squares
size -> max //size - size of squares
最终结果可能如下所示:
1 1 1 1
1 1 1 1
1 1 0 0
其中1
代表方块,0
代表空格。
实际上我看到过类似的问题,但是这些问题都有预定义的方块大小。我写了一些笨拙的算法,但是它的结果非常不令人满意。
编辑:我的当前算法:
我尝试了很多变化,但是我无法让它在所有情况下都完美地工作。实际上,我可以遍历所有可能的大小,但我不喜欢这种方法。
// to make things more simple I put width as bigger size
int biggerSize = this.ClientSize.Width;
int lowerSize = this.ClientSize.Height;
int maxSize = int.MinValue;
int index = 0;
int index2 = 0;
// find max suitable size
for (int i = _rects.Count; i > 0; i--) {
int size = biggerSize / i;
int j = (int)Math.Floor((double)lowerSize / size);
if (i * j >= _boards.Count && size > maxSize) {
maxSize = size;
index = (int)i;
index2 = (int)j;
}
}
int counter = 0;
// place all rectangles
for (int i = 0; i < index; i++) {
for (int j = 0; j < index2; j++) {
if (counter < _rects.Count) {
_rects[counter].Size = new Size(maxSize, maxSize);
_rects[counter].Location = new Point(i * maxSize, j * maxSize);
}
counter++;
}
}