一、问题描述及解析:
给定n个圆的半径序列,将它们放到矩形框中,各圆与矩形底边相切,求具有最小排列长度的圆排列。
二、算法核心步骤(伪代码)及图解:
首先输入圆个数n,再输入n个圆半径,接着计算出最小长度和当前选择的圆中心的横坐标,最后算排列。设置函数来找到的最小的圆排列长度。
已知圆的个数n以及记录各圆半径的数组r[i],i=1,2,3,···n,记录各圆圆心横坐标的数组x[i],i=1,2,3,···n。要记录最短排列长度len,最终求出排列顺序。
图解:
第i个圆不一定和第i-1个圆相切的情况,如图:
核心伪代码(回溯):
void backtrack(int i)
{
if (i > n)
{
compute();
}
else
{
for (int j = i; j <= n; ++j)
{
swap(r[i], r[j]);
double c1 = center_X(i);
if (c1 + r[1] + r[i] < len)
{
x[i] = c1;
backtrack(i + 1);