圓排列問題:給定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...