回溯法 《圓排列問題》 python實現

2021-08-22 14:44:19 字數 1379 閱讀 9556

給定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...