演算法大作業 圓排列問題

2021-10-07 05:19:33 字數 1004 閱讀 3168

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

首先舉乙個例子,當給定的圓半徑為1,1,3時則可以給出如下排列使排列長度最小:

所以這題也算是乙個排列問題,如何排列能夠使排列的長度最小。

在排列時有以下幾種情況:

1、每個圓相繼相切:

如上面的例子裡每個圓都和旁邊的圓相切

2、其中乙個圓很小,兩邊的圓很大:

3、有乙個圓很大其他很小:

所以排在任意位置的圓與其前或後的任意乙個圓都有可能相切的

center計算圓在當前圓排列中的橫座標,由x^2 = sqrt((r1+r2)2-(r1-r2)2)推導出x = 2sqrt(r1r2)。由於第t個圓很可能跟前面任何乙個圓相切。這時,只要把各種情況得到取值全部算出,並把最大值記錄下來,所以在for迴圈裡。

compute計算當前圓排列的長度。變數lenmin記錄當前最小圓排列長度。陣列r儲存所有圓的半徑。陣列x則記錄當前圓排列中各圓的圓心橫座標。

在遞迴演算法backtrack中,當i>n時,演算法搜尋至葉節點,得到新的圓排列方案。此時演算法呼叫compute計算當前圓排列的長度,適時更新當前最優值。當i偽**為:

double

center

(int t)

返回圓心橫座標值

}void compute ()if

(x[i]

+r[i]

>high)}if

(high-low

void backtrack (

int n)

for(

int i=n;i<=n;i++

)}

該演算法的複雜度為o(n!)

演算法大作業 圓排列問題

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

大作業(圓排列問題)

圓排列問題 給定n個圓的半徑序列,將它們放到矩形框中,各圓與矩形底邊相切,求具有最小排列長度的圓排列。圓排列問題的解空間是一棵排列樹,按照回溯法搜尋排列數的演算法框架 設所有圓的半徑為 a r1 r2 r3 rn 那麼對應的排列數有 a 1 n 的全排列構成。並且只要大小合適,目標圓就有可能與排列中...

演算法分析期末大作業 回溯演算法 圓排列問題

第乙個圓的圓心橫座標為0 定義x k 陣列算出排列第k個圓的圓心橫座標 minlen為最短的矩形的長度if centerx r t r 1 求圓心橫座標 double center int t return temp 排列第乙個的圓的圓心橫座標是0 回溯演算法 void backtrack int ...