生活随笔
收集整理的這篇文章主要介紹了
回溯法:全排列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
全排列
遞歸實現:把元素換到數組首位,剩下的部分做全排列
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
] +=1while Selected
[depth
]<size
and not place
(depth
):Selected
[depth
] +=1if Selected
[depth
] <= size
-1:if depth
== size
-1:
for i
in Selected
:print lst
[i
],print ""else:depth
+=1Selected
[depth
] =-1else: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: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 lst
print count
else: depth
+=1Selected
[depth
] = depth
breakelse:depth
-=1 lst
[depth
],lst
[change
[depth
]] = lst
[change
[depth
]],lst
[depth
]change
[depth
] = -1A
= ['A','B','C','D']
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
總結
以上是生活随笔為你收集整理的回溯法:全排列的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。