【全排列】HDU1027Ignatius and the Princess II/HDU1716排列2

全排列函数,666,上次蓝桥杯就沾了全排列的光。。。。

next_pernutation();

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1716

Problem Description

Ray又对数字的列产生了兴趣:

现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数。

Input

每组数据占一行,代表四张卡片上的数字(0<=数字<=9),如果四张卡片都是0,则输入结束。

Output

对每组卡片按从小到大的顺序输出所有能由这四张卡片组成的4位数,千位数字相同的在同一行,同一行中每个四位数间用空格分隔。

每组输出数据间空一行,最后一组数据后面没有空行。

Sample Input

1 2 3 4
1 1 2 3
0 1 2 3
0 0 0 0

Sample Output

1234 1243 1324 1342 1423 1432
2134 2143 2314 2341 2413 2431
3124 3142 3214 3241 3412 3421
4123 4132 4213 4231 4312 4321

1123 1132 1213 1231 1312 1321
2113 2131 2311
3112 3121 3211

1023 1032 1203 1230 1302 1320
2013 2031 2103 2130 2301 2310
3012 3021 3102 3120 3201 3210

注意格式。。。

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
    int a[5],temp=0;
    //freopen("in.txt","r",stdin);      //  调试也要删除
    //freopen("out.txt","w",stdout);
    while(cin>>a[0]>>a[1]>>a[2]>>a[3]){
        if(!a[0]&&!a[1]&&!a[2]&&!a[3]){
            break;
        }
        if(temp) cout<<endl;        //  格式很重要。。。
        temp=1;
        sort(a,a+4);
        int i=0;
        while(a[i]==0){
            i++;
        }
        if(a[0]==0) swap(a[i],a[0]);
        int ans=a[0],flag=0;
        do{
            if(ans!=a[0]){
                ans=a[0];
                flag=0;
                cout<<endl;
            }else if(flag) cout<<' ';
            cout<<a[0]<<a[1]<<a[2]<<a[3];
            flag=1;
        }while(next_permutation(a,a+4));
        cout<<endl;
    }
    return 0;
}

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1027

Problem Description

Now our hero finds the door to the BEelzebub feng5166. He opens the door and finds feng5166 is about to kill our pretty Princess. But now the BEelzebub has to beat our hero first. feng5166 says, "I have three question for you, if you can work them out, I will
release the Princess, or you will be my dinner, too." Ignatius says confidently, "OK, at last, I will save the Princess."

"Now I will show you the first problem." feng5166 says, "Given a sequence of number 1 to N, we define that 1,2,3...N-1,N is the smallest sequence among all the sequence which can be composed with number 1 to N(each number can be and should be use only once
in this problem). So it‘s easy to see the second smallest sequence is 1,2,3...N,N-1. Now I will give you two numbers, N and M. You should tell me the Mth smallest sequence which is composed with number 1 to N. It‘s easy, isn‘t is? Hahahahaha......"

Can you help Ignatius to solve this problem?

Input

The input contains several test cases. Each test case consists of two numbers, N and M(1<=N<=1000, 1<=M<=10000). You may assume that there is always a sequence satisfied the BEelzebub‘s demand. The input is terminated by the end of file.

Output

For each test case, you only have to output the sequence satisfied the BEelzebub‘s demand. When output a sequence, you should print a space between two numbers, but do not output any spaces after the last number.

Sample Input

6 4
11 8

Sample Output

1 2 3 5 6 4
1 2 3 4 5 6 7 9 8 11 10

STL大法 next_pernutation() AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
    int n,m;
    cin.sync_with_stdio(false);
    while(cin>>n>>m){
        int a[1005];
        for(int i=1;i<=n;i++)
            a[i]=i;
        for(int i=1;i<m;i++)
            next_permutation(a+1,a+n+1);
        for(int i=1;i<=n;i++){
            cout<<a[i];
            if(i<n) cout<<' ';
            else cout<<endl;
        }
    }
    return 0;
}

康拓逆展开AC代码:

#include<iostream>
using namespace std;
int fac[]={1,1,2,6,24,120,720,5040,40320};      //  n!
int ans[10001];        //  存储答案的数组;
int len=0;      //  记录数组的长度;
//  n表示总共几个数,k表示第几大的数,num这n个数开始的数
void Cantor(int n,int k,int num)
{
    k--;
    int i,j,vis[11]={0};
    for(i=0;i<n;i++){
        int t=k/fac[n-i-1];     //  (后面个数!)的倍数,t=0,表示该位置的数最小,
        for(j=1;j<=n;j++){
            if(!vis[j]){        //  找没有出现过的第t小的数;
                if(t==0) break;
                t--;
            }
        }
        vis[j]=1;
        k%=fac[n-i-1];
        ans[len++]=j+num-1;
    }
}
int main()
{
    int n,m;
    cin.sync_with_stdio(false);
    while(cin>>n>>m){
        len=0;
        int i=1,j;
        if(n>8){
            int t1=n%8;
            int t2=(n/8-1)*8;
            for(i=1;i<=t1;i++)      //  8的倍数多余出来的肯定不用动
                ans[len++]=i;
            for(j=0;j<t2;j++,i++)   //  8的倍数去掉最后一个8位
                ans[len++]=i;
            Cantor(8,m,i);
        }else Cantor(n,m,i);
        for(int i=0;i<n;i++){
            if(i<n-1) cout<<ans[i]<<' ';
            else cout<<ans[i]<<endl;
        }
    }
    return 0;
}
时间: 2024-08-30 05:50:01

【全排列】HDU1027Ignatius and the Princess II/HDU1716排列2的相关文章

HDU1027-Ignatius and the Princess II

http://acm.hdu.edu.cn/showproblem.php?pid=1027 这道题的意思是输出n个数全排列的第m个全排列. 很明显这道题用的是可以用深搜来解决这个问题, 我的思路是:寻找的是最优子结构,当全排列的第一个数确定之后,就第二个数就是n个数出去第一个数字的任意一个可能. 深搜是状态转移,从一个状态转换到另一个状态. //hdu1027 #include <iostream> #include <cstdio> #include <cstring&g

hdu1027 Ignatius and the Princess II 全排列

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1027 Problem Description Now our hero finds the door to the BEelzebub feng5166. He opens the door and finds feng5166 is about to kill our pretty Princess. But now

HDU 1027 Ignatius and the Princess II[DFS/全排列函数next_permutation]

Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9458    Accepted Submission(s): 5532 Problem Description Now our hero finds the door to the BEelzebub feng5166. He op

HDU 1027 Ignatius and the Princess II(求第m个全排列)

传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1027 Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10388    Accepted Submission(s): 5978 Problem Description Now our

hdu 1027 Ignatius and the Princess II (STL 全排列)

题目链接今天学了 全排列函数 之后,再回过头来看这一题,发现这时对于这样的题 就是一个字 秒 .主要函数有两个 next_permutation 和 prev_permutation这两个一个是向后找 一个是向前找,next的是往后,prev的是向前找.有的人可能不太明白我这里只的向前和向后的意思. 向前 就是 往 字典序小 的 方向 找 ,反之 就是向前. 举个例子把 :假设数组a[n],i<=m,next_permutation(a+i,a+m)就表示对a[i]到a[m]进行操作,每操作一次

Ignatius and the Princess II(全排列)

Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6359    Accepted Submission(s): 3760 Problem Description Now our hero finds the door to the BEelzebub feng5166. He o

HDU1027 Ignatius and the Princess II【全排列】

Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 11536 Accepted Submission(s): 6640 Problem Description Now our hero finds the door to the BEelzebub feng5166. He opens

(全排列)Ignatius and the Princess II -- HDU -- 1027

链接: http://acm.hdu.edu.cn/showproblem.php?pid=1027 Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5822    Accepted Submission(s): 3433 Problem Description Now our h

HDU 1027 Ignatius and the Princess II

原题代号:HDU 1027 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1027 原题描述: Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8415    Accepted Submission(s): 4955 Problem