圓排列問題

2021-10-07 05:25:45 字數 583 閱讀 9910

問題

給定n個圓的半徑序列,將它們放到矩形框中,各圓與矩形底邊相切,求具有最小排列長度的圓排列。

解析該問題是乙個排列問題,問題的解儲存在序列r=中,問題的解空間樹是一顆排列樹。用x=表示當前排列的各個圓的圓心。

下界函式:用center(t)計算新增圓的圓心,每次新增乙個圓則排列的序列會增長,比較center(t)+r[t]+r[0]這個值(注意不是序列中總長,只是t號圓的最右端的長度)和已知序列長度min比較,如果大於min則剪枝。

用compute計算整個序列的長度,遍歷每乙個圓,記錄左端low和右端high,迭代得到low的最小值和hight的最大值,最後做差即可得到序列長度。

設計float center(int t)

return res;

}void compute()

if(high-low

分析時間複雜度:對於排列樹,共有n!次計算;另外在每次計算圓心的過程中有o(n)次計算時間,因此整體演算法時間複雜度為t(n)=o((n+1)!)

原始碼

圓排列問題

給定n個大小不等的圓 c1,c2,cn,現要將這 n個圓排進乙個矩形框中,且要求各圓與矩形框的底邊相切。圓排列問題要求從 n個圓的所有排列中找出有最小長度的圓排列。例如,當 n 3,且所給的 3個圓的半徑分別為1,1,2時,這 3個圓的最小長度的圓排列如圖所示。其最小長度為 2 4 2 void c...

圓排列問題

給定n個大小不等的圓c1,c2,cn,現要將這n個圓排進乙個矩形框中,且要求各圓與矩形框的底邊相切。圓排列問題要求從n個圓的所有排列中找出有最小長度的圓排列。例如,當n 3,且所給的3個圓的半徑分別為1,1,2時,這3個圓的最小長度的圓排列如圖所示。其最小長度為2 4 2。上述演算法尚有許多改進的餘...

圓排列問題

圓排列問題 給定n個圓的半徑序列,將它們放到矩形框中,各圓與矩形底邊相切,求具有最小排列長度的圓排列。圓的擺放位置不同 先後順序不同 得到的結果可能不同,所以這是乙個排列問題,在回溯裡面需要新增全排列的 要得到圓排列的長度,我們需要知道最右邊圓心的橫座標,它的半徑 第乙個圓的半徑 根據演算法的約定,...