一道挺经典的数学问题。基于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,进行了调换。
后面其他形式的出现也是差不多基于这个道理,当然这是我个人理解可能有错误。