【问题标题】:Python permutations with condition (backtracking)带条件的 Python 排列(回溯)
【发布时间】:2016-03-07 17:33:40
【问题描述】:

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

我有用于生成排列列表的代码,但这无济于事,因为我无法在将每个排列添加到列表之前单独检查它,因此它不是回溯,它只是递归。 我也了解回溯的工作方式:从 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

有效但对我没有帮助。我尝试在某处插入验证,但无处可工作。我尝试了所有我能找到的排列算法。我需要一个带回溯的

有什么想法/算法/伪代码可以用条件回溯排列吗?

【问题讨论】:

    标签: python algorithm recursion backtracking


    【解决方案1】:

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

    基本思路是:

    • 将每个元素交换到起始位置。
    • 使用固定索引 [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))
    

    【讨论】:

    • 好的,但是验证在哪里?我的意思是一个名为 valid() 的函数,它检查最终排列是否真的遵守某些规则
    • 已更新以添加有效功能。我认为这应该做你想要的。
    • 在探索决策空间之前添加验证可能更有效,例如if valid: output.extend(permutare(lista, start + 1))
    猜你喜欢
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 2015-01-27
    • 2010-11-23
    • 1970-01-01
    相关资源
    最近更新 更多