日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

回溯法:全排列

發布時間:2024/9/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 回溯法:全排列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

全排列

遞歸實現:把元素換到數組首位,剩下的部分做全排列

def constraint():return Truedef bound():return Truedef perm_backtracking(depth,lst):size = len(lst)if depth == size:print(lst)else:for i in range(depth,size): if constraint() and bound():lst[depth],lst[i] = lst[i],lst[depth]perm_backtracking(depth+1,lst)lst[depth],lst[i] = lst[i],lst[depth]

迭代實現,可以參考完全n叉樹,這個應該是一個通用的迭代的處理方法,在這里:只要不在同一列就行了

def perm_backtracking_iteration(depth,lst):size = len(lst)Selected =[-1]*size# 排列數,列號不能重復def place(k):for i in range(k):if Selected[i] == Selected[k]:return Falsereturn Truewhile depth >=0:Selected[depth] +=1# 直到選擇一個可行的解while Selected[depth]<size and not place(depth):Selected[depth] +=1# 這個就是回溯條件,子集樹不為空if Selected[depth] <= size-1:if depth == size-1: # print Selected# 解碼結果,Selected里面對應的是選擇了哪一個數for i in Selected:print lst[i],print ""else:# 到達下一層時,初始化下一層的子樹的范圍depth +=1Selected[depth] =-1# 回溯,還是從上一層的未選的的地方走else:depth -=1A = ['A','B','C','D'] perm_backtracking(0,A)['A', 'B', 'C', 'D'] ['A', 'B', 'D', 'C'] ['A', 'C', 'B', 'D'] ['A', 'C', 'D', 'B'] ['A', 'D', 'C', 'B'] ['A', 'D', 'B', 'C'] ['B', 'A', 'C', 'D'] ['B', 'A', 'D', 'C'] ['B', 'C', 'A', 'D'] ['B', 'C', 'D', 'A'] ['B', 'D', 'C', 'A'] ['B', 'D', 'A', 'C'] ['C', 'B', 'A', 'D'] ['C', 'B', 'D', 'A'] ['C', 'A', 'B', 'D'] ['C', 'A', 'D', 'B'] ['C', 'D', 'A', 'B'] ['C', 'D', 'B', 'A'] ['D', 'B', 'C', 'A'] ['D', 'B', 'A', 'C'] ['D', 'C', 'B', 'A'] ['D', 'C', 'A', 'B'] ['D', 'A', 'C', 'B'] ['D', 'A', 'B', 'C']

還可以基于排列樹的迭代方式:

def perm_backtracking_iteration2(depth,lst):size = len(lst)Selected =[i for i in range(size)]change = [-1]*size count = 0while depth >=0:# range(Selected[depth],size)記錄的是剩余的次數,這里面還不能表現到底是那幾次?估計還可以改進if Selected[depth] < size:for i in range(Selected[depth],size):# 交換且記錄交換lst[depth],lst[i] = lst[i],lst[depth]change[depth] = iSelected[depth] +=1if depth == size-1:count +=1print lstprint countelse: depth +=1Selected[depth] = depthbreakelse:# 子集樹為空了,回溯到上一層,在最底部是沒有交換動作的,因為change[depth]就是本身,# 所以需要先-1,再交換,可以自己先調試一遍depth -=1 lst[depth],lst[change[depth]] = lst[change[depth]],lst[depth]change[depth] = -1A = ['A','B','C','D'] #perm_backtracking(0,A) perm_backtracking_iteration2(0,A)['A', 'B', 'C', 'D'] 1 ['A', 'B', 'D', 'C'] 2 ['A', 'C', 'B', 'D'] 3 ['A', 'C', 'D', 'B'] 4 ['A', 'D', 'C', 'B'] 5 ['A', 'D', 'B', 'C'] 6 ['B', 'A', 'C', 'D'] 7 ['B', 'A', 'D', 'C'] 8 ['B', 'C', 'A', 'D'] 9 ['B', 'C', 'D', 'A'] 10 ['B', 'D', 'C', 'A'] 11 ['B', 'D', 'A', 'C'] 12 ['C', 'B', 'A', 'D'] 13 ['C', 'B', 'D', 'A'] 14 ['C', 'A', 'B', 'D'] 15 ['C', 'A', 'D', 'B'] 16 ['C', 'D', 'A', 'B'] 17 ['C', 'D', 'B', 'A'] 18 ['D', 'B', 'C', 'A'] 19 ['D', 'B', 'A', 'C'] 20 ['D', 'C', 'B', 'A'] 21 ['D', 'C', 'A', 'B'] 22 ['D', 'A', 'C', 'B'] 23 ['D', 'A', 'B', 'C'] 24

總結

以上是生活随笔為你收集整理的回溯法:全排列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。