P1706 全排列问题,python

本文介绍了使用Python的`permutations`函数和深度优先搜索(DFS)算法解决数学问题的过程,通过两个方法生成所有排列,并解释了DFS的回溯机制。
摘要由CSDN通过智能技术生成

 一道挺经典的数学问题。基于python,我用了两种方法来处理这个问题,第一种是采用

permutations来解决,直接看代码。
from itertools import permutations
def get_all_permutations(elements):
    perms = permutations(elements)
    return list(perms)

n = int(input())
elements = []
for i in range(1, n + 1):
    elements.append(i)
all_perms = get_all_permutations(elements)
for perm in all_perms:
    perm_str = "    ".join(map(str, perm))
    formatted_perm_str = perm_str.rjust(5 * n)
    print(formatted_perm_str)
    
    '''
    print("%5d"%perm,end='') 也可以这样输出
print('')
'''

里面的变量命名可以简化用简单一点的字母表示,想着这样写应该更严谨一点就在文章里面写成单词以及其缩写了。

第二种方法是经典的DFS思路。这里我学习了ღ江晚吟博主的文章,原文链接https://blog.csdn.net/m0_46549425/article/details/108025133

这里同样也是用python实现

n = int(input())
a = [0] * (n + 1)
book = [0] * (n + 1)

def DFS(step):
    if step == n + 1:
        for j in range(1, n + 1):
            print("%5d"%a[j], end='')
        print()
        return

    for i in range(1, n + 1):
        if book[i] == 0:
            a[step] = i
            book[i] = 1
            DFS(step + 1)
            book[i] = 0
    return


DFS(1)

因为没怎么接触过DFS算法,所以研究了一会。感觉就是回溯那一块容易模糊,我就写一下我的观点(可能有误)

我用n=3来说明

按照第一次输出出来是 1 2 3(这个比较容易明白就不多赘述)

到这一步DFS(4)满足后需要回溯到DFS(3),同时触发book[3]=0。因为我们是i==3的时候,使得a[3] = 3,book[3] = 3 所以我们回溯到这一步。

因为i==3是一轮循环的结束(因为n==3)所以就又跳到下一个return回溯,就是DFS(2)。同样的道理这一步是在i=2实现,所以book[2] = 0,但这一轮循环还没有结束,因为i可以到3。然后当i==3,我们发现book[3] == 0,因为上一步被我们改成0了。写成代码就是

 if book[i] == 3:
            a[2] = 3
            book[3] = 1
            DFS(2 + 1)
            book[i] = 0

我把代码放进去,可能更容易懂。这时候数据应该是 1 3 3

然后这一步回到了DFS(3),在新一轮循环中,当i==2时,发现book[2]==0,(同样因为上一步改成0了),这时候的step是3所以a[3]=2。

 if book[2] == 0:
            a[3] = 2
            book[2] = 1
            DFS(3 + 1)
            book[i] = 0

这时候数据就变成了 1 3 2,进行了调换。

后面其他形式的出现也是差不多基于这个道理,当然这是我个人理解可能有错误。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值