圆排列问题
1.问题
给定n个圆的半径序列,将它们放到矩形框中,各圆与矩形底边相切,求具有最小排列长度的圆排列。
2.解析
圆排列问题的解空间是一棵排列树。按照回溯法搜索排列树的算法框架,设开始时a=[r1,r2,……rn]是所给的n个元的半径,则相应的排列树由a[1:n]的所有排列构成。
- 定义一个函数center()来计算圆在当前圆排列中的横坐标,
- 定义一个函数compute()来计算当前圆的排列长度,找到排列的最左端 if(x[i]-r[i]<left) left=x[i]-r[i]; 找到排列的最右端if(x[i]+r[i]>right)计算出最右端 right=x[i]+r[i]; right-left就可以得到圆排列的长度。
- 变量lenmin记录当前最小圆排列长度。数组r存储所有圆的半径。数组x则记录当前圆排列中各圆的圆心横坐标。
- 在递归算法Backtrack中,当k>n时,算法搜索至叶节点,得到新的圆排列方案。此时算法调用Compute计算当前圆排列的长度