-
问题
给定n个大小不等的圆c1,c2,…,cn,现要将这n个圆排进一个矩形框中,且要求各圆与矩形框的底边相切。圆排列问题要求从n个圆的所有排列中找出有最小长度的圆排列。例如,当n=3,且所给的3个圆的半径分别为1,1,2时,这3个圆的最小长度的圆排列如图所示。 -
解析
设计算法:
首先,需要一个函数来计算圆在当前圆排列中的横坐标,由l^2 sqrt((r1+r2)^ 2 - (r1-r2)^2),可推导出l = 2*sqrt(r1 *r2)。
设计一个递归算法,当节点大于n时,算法搜索至叶节点,即分配完全部的圆,得到新的圆排列方案,这时要计算当前圆排列的长度。如果比原来的更小则更新最小值。
若圆的数量还没有分配完,则接着选择下一个要排列的圆,然后继续递推下去。中间包含一个剪枝,如果加上新的圆后的长度大于最小值则直接跳过,搜下一个圆。