带条件的Python置换(回溯)

带条件的Python置换(回溯),python,algorithm,recursion,backtracking,Python,Algorithm,Recursion,Backtracking,我想用回溯法解决一个问题。如。。。我得到了一个数字列表,我想用回溯法找到所有可能的,符合给定条件的排列 我有生成排列列表的代码,但它没有帮助,因为我无法在将每个排列添加到列表之前单独检查它,所以它不是回溯,只是递归的。 我也了解回溯的工作方式:从0到x的排列,但不适用于列表 这是我的排列列表生成器 def permutare(self, lista): if len(lista) == 1: return [lista] res = []

我想用回溯法解决一个问题。如。。。我得到了一个数字列表,我想用回溯法找到所有可能的,符合给定条件的排列

我有生成排列列表的代码,但它没有帮助,因为我无法在将每个排列添加到列表之前单独检查它,所以它不是回溯,只是递归的。 我也了解回溯的工作方式:从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
工作,但没有帮助我。我试着在那里的某个地方插入验证,但没有任何效果。。我尝试了我能找到的所有排列算法。我需要一个带回溯功能的


有没有关于带条件回溯排列的想法/算法/伪代码?

这里有一个通过交换列表中的元素来使用回溯的解决方案

基本思想是:

  • 将每个元素交换到起始位置
  • 计算索引[0:start]已修复的剩余分区
代码:


好的,但是验证去哪里了?我指的是一个名为valid()的函数,它检查最终排列是否真正遵守某些规则,并更新以添加有效函数。我认为这应该是您想要的。在探索决策空间之前添加验证可能更有效,例如
如果有效:output.extend(permutare(lista,start+1))
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))