給定n個圓的半徑序列,將它們放到矩形框中,各圓與矩形底邊相切,求具有最小排列長度的圓排列。
圓排列問題的解空間是一棵排列樹。按照回溯法搜尋排列樹的演算法框架,設開始時a=[r1,r2,……rn]是所給的n個元的半徑,則相應的排列樹由a[1:n]的所有排列構成。
定義乙個函式center()來計算圓在當前圓排列中的橫座標,
定義乙個函式compute()來計算當前圓的排列長度,找到排列的最左端 if(x[i]-r[i]right)計算出最右端 right=x[i]+r[i]; right-left就可以得到圓排列的長度。
變數lenmin記錄當前最小圓排列長度。陣列r儲存所有圓的半徑。陣列x則記錄當前圓排列中各圓的圓心橫座標。
void
backtrack
(int k)
for(
int i=k;i<=n;i++
)swap
(r[k]
,r[i]);
//回溯
}}
由於演算法backtrack在最壞情況下需要計算o(n!)次圓排列長度,每次計算需要o(n)計算時間,得出時間複雜度為o((n+1)!)
空間複雜度為o(n)
《演算法分析與設計》大作業 圓排列問題(回溯法)
目錄 知識點1.問題 2.解析 3.設計 4.分析 5.原始碼 1.回溯法摘自 中琦2513 的原創文章 1 概念 回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達...
演算法分析與設計實踐大作業
圓排列問題 給定n個圓的半徑序列,將它們放到矩形框中,各圓與矩形底邊相切,求具有最小排列長度的圓排列。首先,已知圓的個數n以及記錄各圓半徑的陣列r i i 1 n 記錄各圓圓心橫座標的陣列x i i 1 n。要記錄最短排列長度minlen,最終求出排列順序。要注意,只要大小合適,目標圓就有可能與排列...
演算法分析與實踐 大作業 圓排序問題
圓排列問題 給定n個圓的半徑序列,將它們放到矩形框中,各圓與矩形底邊相切,求具有最小排列長度的圓排列。圓排列問題主要用到了回溯法。問題的解空間是一棵排列數。按照回溯法遍歷每種排列,求得最小排列長度的最優解。變數n為圓的個數 陣列r n 儲存每個圓的半徑,x n 儲存每個圓的圓心座標,bestr n ...