zoukankan      html  css  js  c++  java
  • TOJ 4003 Next Permutation

    描述

    It is an interesting exercise to write a program to print out all permutations of 1, 2, …, n. However, since there are 6227020800 permutations of 1, 2, …, 13, it is unlikely that we would ever run this program on an input of size more than 10.

    However, here is another interesting problem whose solution can also be used to generate permutations. We can order the permutations of 1, 2, …, n under the lexicographic (or dictionary) order. Here are the permutations of 1,2,3 in lexicographic order:

       1 2 3     1 3 2     2 1 3     2 3 1     3 1 2     3 2 1
    The problem we have is the following: given a permutation of 1,2, …, n, generate the next permutation in lexicographic order. For example, for 2 3 1 4 the answer is 2 3 4 1.
     

    输入

    The first line of the input contains two integers, N and K. This is followed by K lines, each of which contains one permutation of 1, 2,…,N.

     You may assume that 1 ≤ N ≤ 1000 and K ≤ 10.

    输出

    The output should consist of K lines. Line i should contain the lexicographically next permutation correponding to the permutation on line i+1 in the input.

     

    样例输入

    3 2
    3 1 2
    2 3 1
    

    样例输出

    3 2 1
    3 1 2 
    

    题目来源

    TOJ

    从数组的后面开始寻找(前面的数)小于(后面的数)的数字对,将它们交换,然后从(前面的数的位置+1)开始将到N-1的数从小到大排序。

    寻找: (前面的数的位置i)从N-2到0,(后面的数的位置j)从N-1到i+1

    #include <stdio.h>
    #include <algorithm>
    #include <iostream>
    using namespace std;
    int main(int argc, char *argv[])
    {
        int N,K;
        int a[1010];
        while( scanf("%d %d",&N ,&K)!=EOF ){ 
            while(K--){
                for(int i=0; i<N; i++){
                    scanf("%d",&a[i]);    
                }
                int flag=0;    
                for(int i=N-2; i>=0 && !flag; i--){
                    for(int j=N-1; j>=i+1; j--){
                        if(a[i]<a[j]){
                            int t=a[j];
                            a[j]=a[i];
                            a[i]=t;                    
                            sort(a+i+1,a+N);
                            flag=1;
                            break;
                        }
                    } 
                }
                flag=0;
                for(int i=0; i<N; i++){
                    if(flag)printf(" ");
                    printf("%d",a[i]);
                    flag=1;
                }
                printf("
    ");
            }
        } 
        return 0;
    }
  • 相关阅读:
    Python中的单例模式——装饰器实现剖析
    HTTP协议中GET和POST的区别(详细描述)
    Mysql:The BLACKHOLE Storage Engine
    Mysql:The ARCHIVE Storage Engine
    Mysql:The CSV Storage Engine
    Mysql:The Memory Storage Engine
    Mysql:The Merge Storage Engine:类【union all】联合视图存储引擎
    .Net Core 3.0全新的sql驱动
    .Net Core 3.0原生Json解析器
    Kubernetes-Service(服务)
  • 原文地址:https://www.cnblogs.com/chenjianxiang/p/3549817.html
Copyright © 2011-2022 走看看