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

 

水dfs

/* ***********************************************
Author        :guanjun
Created Time  :2016/6/28 14:50:20
File Name     :1023.cpp
************************************************ */
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <iomanip>
#include <list>
#include <deque>
#include <stack>
#define ull unsigned long long
#define ll long long
#define mod 90001
#define INF 0x3f3f3f3f
#define maxn 10010
#define cle(a) memset(a,0,sizeof(a))
const ull inf = 1LL << 61;
const double eps=1e-5;
using namespace std;
priority_queue<int,vector<int>,greater<int> >pq;
struct Node{
    int x,y;
};
struct cmp{
    bool operator()(Node a,Node b){
        if(a.x==b.x) return a.y> b.y;
        return a.x>b.x;
    }
};

bool cmp(int a,int b){
    return a>b;
}
char s[30];
int n,k,num,mark;
int vis[30];
void dfs(string s,int cnt){
    if(cnt==n){
        num++;
        cout<<s<<endl;
        if(num==k)mark=1;
        return ;
    }
    if(mark)return ;
    for(int i=0;i<n;i++){
        if(!vis[i]){
            vis[i]=1;
            dfs(s+char(i+'A'),cnt+1);
            vis[i]=0;
        }
    }
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    #endif
    //freopen("out.txt","w",stdout);
    int T;
    cin>>T;
    for(int t=1;t<=T;t++){
        printf("Case %d:\n",t);
        cin>>n>>k;
        cle(vis);
        num=mark=0;
        dfs("",0);
    }
    return 0;
}

 

posted on 2016-06-28 14:59  Beserious  阅读(409)  评论(0编辑  收藏  举报