带条件的Python排列(回溯)

时间:2016-03-07 17:33:40

标签: python algorithm recursion 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

有效,但没有帮助我。我尝试在那里插入验证,但无处可行..我尝试了所有我能找到的排列算法。我需要一个回溯

有条件的回溯排列的任何想法/算法/伪代码?

1 个答案:

答案 0 :(得分:2)

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

基本理念是:

  • 将每个元素交换到起始位置。
  • 使用索引[0:start] fixed
  • 计算剩余分区

代码:

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))
相关问题