圓的全排列

2021-10-07 06:20:10 字數 652 閱讀 9277

問題

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

解析[問題的理解和推導,可用電子版直接在此編寫,也可用紙筆推導,拍照嵌入本文件]

圓的擺放先後順序不同,結果也大概率不同,所以這就變成乙個排列問題,所以只需要把所有排列後得到的排列長度進行全排並取最小值便是本題答案。

例如有三個圓:

圓排列的長度=最右邊圓心的橫座標,+它的半徑+第乙個圓的半徑

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

最後用函式compute()來計算當前圓的排列長度

3. 設計

[核心偽**]

void dfs(int i)

else{

for(int j=i;j<=n;j++){

swap(radius[i],radius[j]);

double point=center(i);//圓心位置

if (point+radius[i]+radius[1]分析

[演算法複雜度推導]

dfs遍歷了一遍:

時間複雜度:t(n)= o(n!)

原始碼[github原始碼位址]

46 全排列 全排列 遞迴

遞迴的時候每次確定乙個位置的數字 nums陣列在遞迴過程中分為左右兩部分,左邊部分是已經確定好的部分,而右邊是待確定數字的部分。每次都嘗試用當前位置右邊的數字來交換當前數字以確定當前數字。題目可以使用collections來優化。詳見 class solution 遞迴過程中每次確定乙個位置的數,遞...

圓排列問題

給定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。上述演算法尚有許多改進的餘...