Python 条件排列(回溯)
Python permutations with condition (backtracking)
我想用回溯法解决一个问题。就像......我得到了一个数字列表,我想使用回溯找到符合给定条件的所有可能排列。
我有生成排列列表的代码,但它无济于事,因为我无法在将每个排列添加到列表之前单独检查它,所以它不是回溯,它只是递归。
我也理解回溯的工作方式:从 0 到 x 的排列,但不适用于列表...
这是我的排列列表生成器
def permutare(self, lista):
if len(lista) == 1:
return [lista]
res = []
for permutation in self.permutare(lista[1:]):
for i in range(len(lista)):
res.append(permutation[:i] + lista[0:1] + permutation[i:])
return res
有效但对我没有帮助。我尝试在某处插入验证,但没有任何效果。我尝试了所有我能找到的排列算法。我需要一个带回溯功能的
任何 idea/algorithm/pseudocode 用于带条件的回溯排列?
这是一个通过交换列表中的元素来使用回溯的解决方案。
基本思路是:
- 将每个元素交换到起始位置。
- 用索引 [0:start] 固定计算剩余分区
代码:
def swap(lista, idx1, idx2):
temp = lista[idx1]
lista[idx1] = lista[idx2]
lista[idx2] = temp
def valid():
return True
def permutare(lista, start):
if start >= len(lista):
if valid():
return [list(lista)]
output = []
for idx in xrange(start, len(lista)):
swap(lista, start, idx)
output.extend(permutare(lista, start + 1))
swap(lista, start, idx) # backtrack
return output
print len(permutare(['a','b','c'], 0))
我想用回溯法解决一个问题。就像......我得到了一个数字列表,我想使用回溯找到符合给定条件的所有可能排列。
我有生成排列列表的代码,但它无济于事,因为我无法在将每个排列添加到列表之前单独检查它,所以它不是回溯,它只是递归。 我也理解回溯的工作方式:从 0 到 x 的排列,但不适用于列表...
这是我的排列列表生成器
def permutare(self, lista):
if len(lista) == 1:
return [lista]
res = []
for permutation in self.permutare(lista[1:]):
for i in range(len(lista)):
res.append(permutation[:i] + lista[0:1] + permutation[i:])
return res
有效但对我没有帮助。我尝试在某处插入验证,但没有任何效果。我尝试了所有我能找到的排列算法。我需要一个带回溯功能的
任何 idea/algorithm/pseudocode 用于带条件的回溯排列?
这是一个通过交换列表中的元素来使用回溯的解决方案。
基本思路是:
- 将每个元素交换到起始位置。
- 用索引 [0:start] 固定计算剩余分区
代码:
def swap(lista, idx1, idx2):
temp = lista[idx1]
lista[idx1] = lista[idx2]
lista[idx2] = temp
def valid():
return True
def permutare(lista, start):
if start >= len(lista):
if valid():
return [list(lista)]
output = []
for idx in xrange(start, len(lista)):
swap(lista, start, idx)
output.extend(permutare(lista, start + 1))
swap(lista, start, idx) # backtrack
return output
print len(permutare(['a','b','c'], 0))