求一个矩形内若干圆的面积占比最大值的算法

刚无聊想到一道算法题
已知一个矩形的的长宽和圆的个数,求这里面圆的面积占比最大为多少?
比如一个10*10的矩形,如果要求圆的个数为一,那么这个圆的直径应该就是10了,如果园的个数为2,那么这两个圆的直径可能一个10,另一个就是大圆的边角了,或者两个直径都是5或者其他,但是需要里面圆占得面积比是最高的,所以两个圆的直径应该是唯一的,同样三个圆四个圆,或者矩形的长宽比为3:2等等,那么里面的圆应该怎样的。

函数

//h:矩形的高,w:矩形的宽,count:圆的个数
function fn(h,w,count) {
            
}
阅读 7.1k
2 个回答

尽可能取半径最大值优先画圆。

以下算法思路有错误,忽略

每个矩形内画一个圆后

  1. 必定有4个角落空间可以继续画圆
  2. 也有可能存在矩形的长-宽的剩余的空间继续画圆(如果是正方形,则此条不存在)

思路是每次画圆后,根据当前的长,宽计算出上面2条可能出现的长,宽,半径,放入优先队列,接着每次取出最大的半径值继续画圆,直到count为0

用下面一张图来说明这个问题的解的思路

clipboard.png
图片来自:http://mathworld.wolfram.com/...

很明显,每次填充圆进去的时候,半径应该尽可能的 直接取可填充的最大值 就行了
题主考虑的,两个圆,让其中一个小一点,然后给另一个留出空间,达到总面积更大,其实 并不存在
当然真要写起代码来还是相当复杂的……各种无理数运算……
如果精度要求不高的话,用平移的方法,对圆心点进行不断偏移尝试,应该是个比较科学的思路

Update 2018.12.29:
观察下图一图二啊,这么明显的啊。(A+B)2 = (A)2 + (B)2 + 2AB 啊。
(A+B)2 > (A)2 + (B)2 啊,必然是 能填越大的半径就填越大的,就行啊。

反向思考:
让一个大圆减小 X 的半径,不可能能让另一个小圆增加 >X 的半径
因此,并不存在两个圆怎么排布,让位置的问题。
始终都是填最大的圆进去,就是最优解

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题