美文网首页
输出全排列 (20 分)

输出全排列 (20 分)

作者: 浪汐颜 | 来源:发表于2019-11-18 16:02 被阅读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]

相关文章

  • 输出全排列 (20 分)

    输出全排列 (20 分) 请编写程序输出前n个正整数的全排列(3<=n<=7),按字典序输出。 输入格式:一行输入...

  • 2019-10-14 递归输出全排列的一种新方法(C语言描述)

    前言 最近在数据结构的作业题中,出现了这样一道题目: 7-2 输出全排列 (20 分) 请编写程序输出前n个正整数...

  • 子集、全排列、第k个排列

    子集输出 全排列输出 存在重复数字的全排列 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。 按大...

  • 输出数组的全排列

    思想: n 个元素数组全排列 = 第 1 个前缀 + 后 n - 1 个元素全排列 输出第 k 个元素之后的全排列...

  • LeetCode:全排列

    46. 全排列 给定一个** 没有重复** 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:...

  • 全排列与n皇后的关系与递归实现

    全排列 对于全排列中的一般问题则是根据字典序从小到大输出指定数量或者序列的全排列。一个简单的问题则是:指定n个整数...

  • 全排列&子集的生成

    全排列 生成 1 ~ n 的全排列 输出: 断点打在这里 index == 0 数字被使用后会被记录,避免了重复以...

  • 每日leetcode 46 2020-04-23

    46. 全排列 给定一个没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3]输出:[[1...

  • 全排列

    对几个数进行全排列,如1,2,3进行全排列。可以采用递归加循环的方式.一次排列的结束就输出一次。else中的for...

  • 全排列

    46. 全排列 题目描述 给定一个没有重复数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[...

网友评论

      本文标题:输出全排列 (20 分)

      本文链接:https://www.haomeiwen.com/subject/wddbictx.html