lightoj-1023 - Discovering Permutations(全排列)
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] = '\0'; // 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:\n",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("\n"); // cnt++; // }while(next_permutation(a,a+n)&&(k>cnt)); } return 0; }