我有几年这个问题了。一段时间以前,我的城镇正在进行信息学竞赛。我没有解决它,我的老师没有解决它。我没有见过任何能够解决它的人。我认识的人都不知道给出答案的正确方法,所以我决定将其发布在这里:
泽问题
给定一个矩形,X乘Y,找到具有固定给定半径R的最小圆N数,这是完全覆盖矩形的每个部分所必需的。
我想到了解决它的方法,但我没有什么明确的。如果每个圆圈定义一个内部矩形,则R^2 = Wi^2 + Hi^2
,其中Wi
和Hi
是每个圆i
覆盖的实际区域的宽度和高度。首先,我认为Wi
对Wj
= i
j
等H
,Wi/Hi
为X/Y
。这样,我可以通过使宽度/高度比率与主矩形(N=X/Wi
= X
)相等来简化问题。那样,Y
。但是,如果Wi
大大超过Hi
,反之亦然,那么这个解决方案肯定是错误的
第二个想法是,对于任何给定的i
,{{1}} = {{1}}。这样,正方形可以最有效地填充空间。但是,如果一个非常狭窄的条带仍然存在,使用矩形填充它会更好,或者更好 - 在此之前使用矩形作为最后一行。
然后我意识到没有一个想法是最优的,因为我总能找到更好的方法来做到这一点。它将永远接近最终,但不是最终的。
修改
在某些情况下(大矩形)连接六边形似乎比连接正方形更好。
进一步编辑
这是两种方法的比较:三叶草与六角形。对于大型表面,六角形显然更好。但我确实认为,当矩形足够小时,矩形方法可能更有效。这是一种预感。现在,在图片中,您会在左侧看到14个圆圈,在右侧看到13个圆圈。虽然表面的差异比一个圆圈大得多(双倍)。这是因为它们在左侧重叠较少,因此浪费的表面较少。
问题仍然存在:
答案 0 :(得分:9)
对于与R相比较大的X和Y,六边形(蜂窝状)图案接近最佳。 X方向上圆心之间的距离为sqrt(3)*R
。 Y方向上的行之间的距离为3*R/2
,因此您需要大约X*Y/R^2 * 2*/(3*sqrt(3))
个圆圈。
如果使用方形图案,水平距离较大(2*R
),但垂直距离要小得多(R
),因此您需要大约X*Y/R^2 * 1/2
个圆圈。从2/(3*sqrt(3) < 1/2
开始,六边形模式就更好了。
请注意,这只是一个近似值。通常可以稍微摇动常规图案以使某些东西适合标准图案不适合的位置。如果X和Y与R相比较小,则尤其如此。
就您的具体问题而言:
六边形图案是整个平面的最佳覆盖。在X和Y有限的情况下,我认为通常可以获得更好的结果。简单的例子是当高度小于半径时。在这种情况下,您可以将一行中的圆圈进一步分开,直到每对圆的交叉点之间的距离等于Y.
具有常规模式会对解决方案施加额外限制,因此在这些限制下的最佳解决方案可能不是最佳解决方案。一般来说,有些不规则的模式可能会更好(参见mbeckish链接的页面)。
同一页面上的示例都是特定的解决方案。具有更多圆圈的解决方案稍微类似于六边形图案。但是,似乎没有一个封闭形式的解决方案。
答案 1 :(得分:7)
This网站从一个稍微不同的角度攻击问题:给定n个单位圆圈,它们可以覆盖的最大方块是什么?
如您所见,随着圆圈数量的变化,覆盖模式也会发生变化。
对于您的问题,我认为这意味着:不同的矩形尺寸和圆形尺寸将决定不同的最佳覆盖模式。
答案 2 :(得分:2)
六边形比钻石好。考虑每个单元所涵盖的单位圆的百分比面积:
#!/usr/bin/env ruby
include Math
def diamond
# The distance from the center to a corner is the radius.
# On a unit circle, that is 1.
radius = 1
# The edge of the nested diamond is the hypotenuse of a
# right triangle whose legs are both radii.
edge = sqrt(radius ** 2 + radius ** 2)
# The area of the diamond is the square of the edge
edge ** 2
end
def hexagon
# The hexagon is composed of 6 equilateral triangles.
# Since the inner edges go from the center to a hexagon
# corner, their length is the radius (1).
radius = 1
# The base and height of an equilateral triangle whose
# edge is 'radius'.
base = radius
height = sin(PI / 3) * radius
# The area of said triangle
triangle_area = 0.5 * base * height
# The area of the hexagon is 6 such triangles
triangle_area * 6
end
def circle
radius = 1
PI * radius ** 2
end
puts "diamond == #{sprintf "%2.2f", (100 * diamond / circle)}%"
puts "hexagon == #{sprintf "%2.2f", (100 * hexagon / circle)}%"
和
$ ./geometrons.rb
diamond == 63.66%
hexagon == 82.70%
此外,正六边形是形成regular tessellation of the plane的最高顶点多边形。
答案 3 :(得分:-2)
当圆圈被设置为具有四个叶子的三叶草,中间有第五个圆圈时,圆圈将覆盖等于R * 2 * R
的区域。在此安排中,问题变为:覆盖R * 2 * R
区域的圈数将覆盖W * H
?或N * R * 2 * R = W * H
的区域。所以N = W * H / R * 2 * R
。