給定n個大小不等的圓c1,c2,…,cn,現要將這n個圓排進乙個矩形框中,且要求各圓與矩形框的底邊相切。圓排列問題要求從n個圓的所有排列中找出有最小長度的圓排列。例如,當n=3,且所給的3個圓的半徑分別為1,1,2時,這3個圓的最小長度的圓排列如圖所示。其最小長度為
def compute(d, a, n, l, c): #d表示輸入半徑的列表,a表示第幾個半徑,n表示半徑的總共個數,l表示上一次計算的邊長,c表示上一次圓的半徑
d1 = copy.deepcopy(d) #對d進行深拷貝
if a == n: #當計算到第n個半徑時,將結果儲存在列表cc中
global cc
#print cc
else:
for i in range(0, len(d1)):
if d1[i] != 0:
t = bianchang(d1[i], l, c) #當加入新的圓時,計算加入後的邊長
w = d1[i]
d1[i] = 0 #該半徑計算完成後,將其置為0,標誌已經計算結束
compute(d1, a + 1, n, t, w)
d1[i] = w #再將該半徑的值恢復,方便下一次的回溯計算
if __name__ == '__main__':
n = input() #n表示輸入半徑的個數
d = sys.stdin.readline().strip().split(' ') #d表示輸入的半徑,以空格進行分割
d = map(int, d)
compute(d, 0, n, 0, 0) #回溯演算法
print min(cc)
圓排列問題 回溯法
問題描述 給定n個大小不等的圓 c1 c2 c3 c4 要將n個圓排進乙個矩形框中,且要求底邊相切。找出有最小長度的圓排列。例如 當n 3,且所給的3個圓半徑分別為1,1,2時,這3個圓的最小長度的圓排列 最小長度為2 4根號2.演算法設計 設開始的a r1,r2,r3,r4.rn 是所給的n歌圓半...
《演算法分析與設計》大作業 圓排列問題(回溯法)
目錄 知識點1.問題 2.解析 3.設計 4.分析 5.原始碼 1.回溯法摘自 中琦2513 的原創文章 1 概念 回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達...
回溯法 全排列
有重複數字的全排列 元素奇偶相間的排列 給定乙個沒有重複數字的序列,返回其所有可能的全排列。輸入 1,2,3 輸出 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 利用 回溯法排列樹模板 沒有限定條件即就是沒有衝突。class solution def permute sel...