演算法分析與實踐 大作業 圓排序問題

2021-10-07 04:31:49 字數 915 閱讀 4662

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

圓排列問題主要用到了回溯法。問題的解空間是一棵排列數。按照回溯法遍歷每種排列,求得最小排列長度的最優解。

變數n為圓的個數

陣列r[n]儲存每個圓的半徑,x[n]儲存每個圓的圓心座標,bestr[n]儲存最小圓排序的半徑順序。

minlen儲存最小排列長度。

center函式計算該圓在排列中的橫座標(首個圓的圓心座標為0)。

compute函式計算當前排列長度。

backtrack函式為核心函式,通過遞迴遍歷每種排列。

第一次遍歷得到abc的排列,然後通過不斷遞迴回溯,得到最優解。

double center(int t)//得到每個圓的圓心座標

return temp;

}void compute()//計算最小排列長度

if (high - low < minlen)//更新minlen和bestr陣列 }

void backtrack(int t)

else

temp = r[t];

r[t] = r[j];

r[j] = temp;

} }}

backtrack函式的複雜度為o(n!),每次排列都需要呼叫一次compute函式,而compute函式複雜度為o(n),所以整個演算法複雜度為o(n*n!)

參考:

演算法分析與設計實踐 大作業 圓排列問題

給定n個圓的半徑序列,將它們放到矩形框中,各圓與矩形底邊相切,求具有最小排列長度的圓排列。圓排列問題的解空間是一棵排列樹。按照回溯法搜尋排列樹的演算法框架,設開始時a r1,r2,rn 是所給的n個元的半徑,則相應的排列樹由a 1 n 的所有排列構成。定義乙個函式center 來計算圓在當前圓排列中...

演算法分析與實踐 大作業

給定n個圓的半徑序列,將它們放到矩形框中,各圓與矩形底邊相切,求具有最小排列長度的原序列。一般而言我們會想到這種做法 但是這種只是其中一種,我們並沒有考慮完全,還有一些如 小球本來可以放到兩個大球的中間,不增加長度的 這個就類似於最短路的問題,由此我們想到了回溯演算法。開始時設a r1,r2,rn ...

演算法分析與設計實踐大作業

圓排列問題 給定n個圓的半徑序列,將它們放到矩形框中,各圓與矩形底邊相切,求具有最小排列長度的圓排列。首先,已知圓的個數n以及記錄各圓半徑的陣列r i i 1 n 記錄各圓圓心橫座標的陣列x i i 1 n。要記錄最短排列長度minlen,最終求出排列順序。要注意,只要大小合適,目標圓就有可能與排列...