Jamie,我将“最佳行数和列数”解释为“多少行和列将提供最大的矩形,与所需的比例和屏幕尺寸一致”。这是解释的简单方法。
每个可能的选择(矩形的行数和列数)都会产生指定比例的最大可能大小的矩形。循环可能的选择并计算结果大小实现了对可能解决方案空间的简单线性搜索。这里有一段代码可以做到这一点,使用 480 x 640 的示例屏幕和 3 x 5 比例的矩形。
def min (a, b)
a < b ? a : b
end
screenh, screenw = 480, 640
recth, rectw = 3.0, 5.0
ratio = recth / rectw
puts ratio
nrect = 14
(1..nrect).each do |nhigh|
nwide = ((nrect + nhigh - 1) / nhigh).truncate
maxh, maxw = (screenh / nhigh).truncate, (screenw / nwide).truncate
relh, relw = (maxw * ratio).truncate, (maxh / ratio).truncate
acth, actw = min(maxh, relh), min(maxw, relw)
area = acth * actw
puts ([nhigh, nwide, maxh, maxw, relh, relw, acth, actw, area].join("\t"))
end
运行该代码提供以下跟踪:
1 14 480 45 27 800 27 45 1215
2 7 240 91 54 400 54 91 4914
3 5 160 128 76 266 76 128 9728
4 4 120 160 96 200 96 160 15360
5 3 96 213 127 160 96 160 15360
6 3 80 213 127 133 80 133 10640
7 2 68 320 192 113 68 113 7684
8 2 60 320 192 100 60 100 6000
9 2 53 320 192 88 53 88 4664
10 2 48 320 192 80 48 80 3840
11 2 43 320 192 71 43 71 3053
12 2 40 320 192 66 40 66 2640
13 2 36 320 192 60 36 60 2160
14 1 34 640 384 56 34 56 1904
由此可见,4x4 或 5x3 布局都会产生最大的矩形。同样清楚的是,矩形大小(作为行数的函数)在极端情况下是最差的(最小的),在中间点是最好的(最大的)。假设矩形的数量适中,您可以简单地用您选择的语言对上述计算进行编码,但一旦结果面积在上升到最大值后开始减少,就立即退出。
这是一个快速而肮脏(但我希望相当明显)的解决方案。如果矩形的数量变得足够大,您可以通过多种方式调整性能:
- 使用更复杂的搜索算法(划分空间并递归搜索最佳段),
- 如果程序过程中矩形的数量不断增加,则保留之前的结果并仅搜索附近的解决方案,
- 应用一些微积分来获得更快、更精确但不太明显的公式。