输出全排列 (20 分)

2019-11-18  本文已影响0人  浪汐颜

输出全排列 (20 分)

请编写程序输出前n个正整数的全排列(3<=n<=7),按字典序输出。

输入格式:
一行输入正整数n。
输出格式:
按字典序输出1到n的全排列。每种排列占一行,数字间无空格。

输入样例:
在这里给出一组输入。例如:
3
输出样例:
在这里给出相应的输出。例如:
123
132
213
231
312
321

'''
字典序如下:

设P是1~n的一个全排列:pn=p1p2...pj-1pjpj+1...pk-1pkpk+1...pn

1)从排列的右端开始,找出第一个比右边数字小的数字的序号j(j从左端开始计算)
  即 j=max{i|pi<pi+1}

2)在pj的右边的数字中,找出所有比pj大的数中最小的数字pk
  即 k=max{i|pi>pj}(右边的数从右至左是递增的,
  因此k是所有大于pj的数字中序号最大者)

3)对换pj,pk

4)再将pj+1......pk-1pkpk+1......pn倒转得到排列
p'=p1p2.....pj-1pjpn.....pk+1pkpk-1.....pj+1,这就是排列p的下一个排列。
'''
def r_find_firstmin(n_list):
    j = 0
    for i in range(len(n_list)-1, 0, -1):
        if n_list[i-1] < n_list[i]:
            j = i-1
            break
    return j
def find_rlistmax_min(n_list,j):
    min_k = 0
    for k in range(j+1,len(n_list)):
        if n_list[k] > n_list[j] and (min_k > n_list[k] or min_k == 0):
            min_k = n_list[k]

    return n_list.index(min_k)



#获取数字n
n = int(input())
#get the progression
n_list = [i for i in range(1,n+1)]
n_last = sorted(n_list, reverse=True)
i = 0
while True:
    if n_list == n_last:
        print(*n_list,sep="")
        break
    print(*n_list,sep="")
    j = r_find_firstmin(n_list)
    k = find_rlistmax_min(n_list,j)
    n_list[j],n_list[k] = n_list[k],n_list[j]
    n_list = n_list[:j+1]+n_list[n-1:j:-1]

上一篇下一篇

猜你喜欢

热点阅读