圓排列問題

2021-10-06 20:03:39 字數 652 閱讀 1086

圓排列問題:給定n個圓的半徑序列,將它們放到矩形框中,各圓與矩形底邊相切,

求具有最小排列長度的圓排列。

圓的擺放位置不同【先後順序不同】,得到的結果可能不同,所以這是乙個排列問題,在回溯裡面需要新增全排列的**

要得到圓排列的長度,我們需要知道最右邊圓心的橫座標,+它的半徑+第乙個圓的半徑【根據演算法的約定,第乙個圓的圓心橫座標為0,**中有標記】

那麼我們如何計算當前圓的橫座標,根據遞迴的思想,第n個圓的圓心橫座標=與他相切的圓的橫座標+2*sqrt(r[n]*r[n-1])由[(r1+r2)^2 -(r1-r2)^2 ]化簡得到

這裡為什麼不是與他前乙個圓相切了?因為當前圓可能和之前某乙個圓相切,但不一定就和前乙個相切,所以這就是**裡面為什麼有個for迴圈

我們還需要乙個函式compute()來計算當前圓的排列長度,找到排列的最左端 if(x[i]-r[i]right)//計算出最右端 right=x[i]+r[i]; right-left就得到了圓排列的長度。

void backtrack(int t)

swap(r[t], r[i]);

}}}

時間複雜度

全排列為n!,每乙個排列結果計算一次長度,compute()為n

時間複雜度即n!*n

原始碼:

圓排列問題

給定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個圓的半徑序列,將它們放到矩形框中,各圓與矩形底邊相切,求具有最小排列長度的圓排列。解析該問題是乙個排列問題,問題的解儲存在序列r 中,問題的解空間樹是一顆排列樹。用x 表示當前排列的各個圓的圓心。下界函式 用center t 計算新增圓的圓心,每次新增乙個圓則排列的序列會增長,比較ce...