失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 回溯法:全排列

回溯法:全排列

时间:2022-10-10 15:31:12

相关推荐

回溯法:全排列

全排列

递归实现:把元素换到数组首位,剩下的部分做全排列

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

如果觉得《回溯法:全排列》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。