【问题标题】:Fully cover a rectangle with minimum amount of fixed radius circles用最少的固定半径圆完全覆盖一个矩形
【发布时间】:2011-10-10 17:30:53
【问题描述】:

我已经有这个问题好几年了。不久前在我镇上参加了一次信息学竞赛。我解决不了,老师也解决不了。我还没有遇到任何能够解决它的人。我认识的人都不知道给出答案的正确方法,所以我决定在这里发布:

泽问题

给定一个 X 乘 Y 的矩形,找出在给定半径 R 的情况下完全覆盖矩形每个部分所必需的最小圆数 N。


我已经想到了解决它的方法,但我没有确定的方法。如果每个圆圈定义一个内部矩形,则R^2 = Wi^2 + Hi^2,其中WiHi 是每个圆圈i 所覆盖的实际区域的宽度和高度。起初我想我应该让任何i=jWi等于WjH也一样。这样,我可以通过使宽/高比与主矩形 (Wi/Hi = X/Y) 相等来简化问题。这样,N=X/Wi。但如果X 大大超过Y 或反之亦然,该解决方案肯定是错误的。
第二个想法是Wi=Hi 对于任何给定的i。这样,正方形最有效地填充空间。但是,如果仍然有一条非常窄的条带,则使用矩形来填充它会更理想,或者更好的是 - 在之前的最后一行也使用矩形。
然后我意识到没有一个想法是最佳的,因为我总能找到更好的方法来做到这一点。它总是接近最终的,但不是最终的。

编辑
在某些情况下(大矩形)连接六边形似乎比连接正方形更好。

进一步编辑
这是两种方法的比较:三叶草与六边形。显然,六边形更适合大表面。但是,我确实认为,当矩形足够小时,矩形方法可能更有效。这是一种预感。现在,在图片中,您可以看到左侧有 14 个圆圈,右侧有 13 个圆圈。虽然表面的差异比一个圆圈大得多(两倍)。这是因为在左侧它们重叠较少,因此浪费较少的表面。

问题仍然存在:

  1. 正六边形图案本身是否最佳?或者应该对主矩形的某些部分进行某些调整。
  2. 是否有理由不使用常规形状作为“终极解决方案”?
  3. 这个问题还有答案吗? :)

【问题讨论】:

  • 这看起来更像是数学而不是编程。
  • 我建议在 math.SE 上询问 math.stackexchange.com
  • 如果能解决的不是公式,而是复杂的算法?我只是重新标记它。
  • 每个问题的 R 大小都一样吗?圆圈可以“溢出”矩形的区域吗?如果圆可以溢出矩形并且R可以根据问题改变,为什么不设置R = max(X,Y)* 2?然后圆圈将覆盖整个矩形,您将只使用 1 个圆圈。
  • 给定 X、Y 和 R,求 N。是的,圆圈可以重叠、溢出、overaything,只要它是最小的数字。

标签: algorithm math


【解决方案1】:

对于比 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 相比较小,则尤其如此。

就您的具体问题而言:

  1. 六边形图案是整个平面的最佳覆盖。在 X 和 Y 有限的情况下,我认为通常可以获得更好的结果。一个简单的例子是当高度小于半径时。在这种情况下,您可以将一行中的圆进一步分开,直到每对圆的交点之间的距离等于 Y。

  2. 具有常规模式会对解决方案施加额外的限制,因此在这些限制下的最佳解决方案可能在移除这些限制后不是最佳的。一般来说,稍微不规则的图案可能会更好(参见 mbeckish 链接的页面)。

  3. 同一页面上的示例都是特定的解决方案。具有更多圆圈的解决方案在某种程度上类似于六边形图案。不过,似乎没有封闭形式的解决方案。

【讨论】:

    【解决方案2】:

    This 站点从稍微不同的角度来解决这个问题:给定 n 个单位圆,它们可以覆盖的最大正方形是多少?

    如您所见,随着圆圈数量的变化,覆盖图案也会发生变化。

    对于您的问题,我相信这意味着:不同的矩形尺寸和圆形大小将决定不同的最佳覆盖模式。

    【讨论】:

    • ...难怪我小时候没有想出解决方案,而这被呈现给我。
    • 不错!事实上,很容易看出在那个链接上讨论的问题比这个问题更容易。 (将此问题限制为正方形。观察到所需的圆数随着正方形的大小而单调增加。因此,给定一个针对此问题的算法,您可以对正方形大小进行二分搜索以找到最大的正方形 - 任意精度-- 可以被 n 圈覆盖。)
    • @Nemo - 只有当你知道所有 n 的 n 个圆圈可以覆盖的最大正方形时,这才有效。不幸的是,我认为情况并非如此。对于我链接到的页面上显示的 12 个案例,似乎每个案例都是单独解决的。
    • @mbeckish - 我的意思是如果你有一个算法来解决这个问题(给定一个矩形,需要多少个圆来覆盖它们?),你可以将它用作解决另一个问题的子程序(给定 n 个相同的圆圈,它们可以覆盖的最大正方形是多少?)。因此,这个问题比其他问题更难。
    【解决方案3】:

    六边形比菱形好。考虑每个单位圆覆盖的百分比面积:

    #!/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 的最高顶点多边形。

    【讨论】:

      【解决方案4】:

      根据我的计算,正确答案是:

      D=2*R; X >= 2*D, Y >= 2*D,
      N = ceil(X/D) + ceil(Y/D) + 2*ceil(X/D)*ceil(Y/D)
      

      在特定情况下,如果 X/D 和 Y/D 的余数等于 0,则

      N = (X + Y + X*Y/R)/D
      
      Case 1: R = 1, X = 2, Y = 2, then  N = 4
      
      Case 2: R = 1, X = 4, Y = 6, then  N = 17
      
      Case 3: R = 1, X = 5, Y = 7, then  N = 31
      

      希望对你有帮助。

      【讨论】:

      • 只有当你能证明它们的合理性时,你的计算才会有帮助。
      【解决方案5】:

      当圆圈布置成四叶草,中间有第五个圆圈时,圆圈将覆盖等于R * 2 * R 的区域。在这种安排下,问题变成:覆盖R * 2 * R 区域的圆圈将覆盖W * H 的区域?,或N * R * 2 * R = W * H。所以N = W * H / R * 2 * R

      【讨论】:

      • 你会画那个吗?根据您的描述(4 个相切圆,中间有一个圆),每 3 个新添加的圆的边际表面等于 4 * R^2(这意味着一个圆的边际表面等于 4/3 * R^2。而当使用来自单个圆圈的正方形时给出了2 * R^2 的边际表面。要么三叶草是一个不太理想的解决方案,要么我不明白你的想法。
      猜你喜欢
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 2014-01-17
      • 1970-01-01
      相关资源
      最近更新 更多