zoukankan      html  css  js  c++  java
  • lightoj-1023

    1023 - Discovering Permutations
    PDF (English) Statistics Forum
    Time Limit: 0.5 second(s) Memory Limit: 32 MB
    In this problem you have to find the permutations using the first N English capital letters. Since there can be many permutations, you have to print the first K permutations.

    Input
    Input starts with an integer T (≤ 100), denoting the number of test cases.

    Each case contains two integers N, K (1 ≤ N ≤ 26, 1 ≤ K ≤ 30).

    Output
    For each case, print the case number in a line. Then print the first K permutations that contain the first N English capital letters in alphabetical order. If there are less than K permutations then print all of them.

    Sample Input
    Output for Sample Input
    2
    3 8
    10 10
    Case 1:
    ABC
    ACB
    BAC
    BCA
    CAB
    CBA
    Case 2:
    ABCDEFGHIJ
    ABCDEFGHJI
    ABCDEFGIHJ
    ABCDEFGIJH
    ABCDEFGJHI
    ABCDEFGJIH
    ABCDEFHGIJ
    ABCDEFHGJI
    ABCDEFHIGJ
    ABCDEFHIJG

    解题思路: 全排列模板改进一下,直接过。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #include<string>
    using namespace std;
    
    char a[26]={'A','B','C','D','E','F','G',
                'H','I','J','K','L','M','N',
                'O','P','Q','R','S','T','U',
                'V','W','X','Y','Z'};
    int T,n,k,cnt;
    string str[130];
    
    bool permutation(int num){
        if(num>=n){
            int i;int sum;
            sum = 0;
                str[cnt] = a;    
            str[cnt][n] = '';
    //        cout<<str[cnt]<<endl;
            cnt++;
            if(cnt>=120) return false;
            return true;
        }
        for(int i=num;i<n;i++){
            swap(a[num],a[i]);
            if(!permutation(num+1)) return false; //这里直接返回后没执行下面的swap, 所以下一个case的时候要先把a[]重新排好序。 
            swap(a[num],a[i]);
        }
        return true;
    }
    
    
    
    int main(){
        
        
        scanf("%d",&T);
        for(int t=1;t<=T;t++){
            cnt = 0;
            scanf("%d%d",&n,&k);
            printf("Case %d:
    ",t);
    
            sort(a,a+26);
            permutation(0);
            sort(str,str+cnt);
            for(int i=0;i<min(cnt,k);i++) {
                for(int j=0;j<n;j++) cout<<str[i][j];    
                cout<<endl;
            }
    // 用全排列的STL的写法。    
    //        do{
    //            for(int i=0;i<n;i++) printf("%c",a[i]);
    //            printf("
    ");
    //            cnt++;    
    //        }while(next_permutation(a,a+n)&&(k>cnt));
            
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Java 字符串,byte[],16进制的字符串互转
    Java中char的字节数
    有向图 获取回路转
    java字符串分割处理split及特殊符号 转
    java如何直接跳出外层循环 标签
    求有向图中两点间所有路径
    五周突破N1 第五周第三单元
    5周突破N1 惯用句 1
    5周N1 300P
    5周突破N
  • 原文地址:https://www.cnblogs.com/yuanshixingdan/p/5551450.html
Copyright © 2011-2022 走看看