hdu1716排列2(stl:next_permutation+优先队列)

排列2

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 5437    Accepted Submission(s): 2072

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

Source

2007省赛集训队练习赛(2)

还有比这道题格式更牛的吗?我都吐血了。。。

PE了7 8 次。。最后试一试的态度 竟然AC了。。

放一张输出的图片吧

感觉看了输出就懂的了这道题的格式。

#include <stdio.h>
#include <queue>
#include <algorithm>
using namespace std;
int main()
{
    int a[4];
    priority_queue<int,vector<int>,greater<int> >s;
    for(int i=0;i<4;i++)
    scanf("%d",&a[i]);
    while(1)
    {
        if(a[0]==a[1]&&a[1]==a[2]&&a[2]==a[3]&&a[0]==0)
        break;
        do
        {
            int sum=0;
            for(int i=3;i>=0;i--)
            sum=sum*10+a[i];
            if(sum>1000)
            s.push(sum);
        }while(next_permutation(a,a+4));
        for(int i=1;i<=9;i++)
        {
            if(s.top()/1000==i)
            {
                printf("%d",s.top()),s.pop();
                while(s.top()/1000==i&&!s.empty())
                {
                    printf(" %d",s.top());
                    s.pop();
                }
                printf("\n");
            }
        }
        for(int i=0;i<4;i++)
        scanf("%d",&a[i]);
        if(a[0]==a[1]&&a[1]==a[2]&&a[2]==a[3]&&a[0]==0)
        break;
        else
        printf("\n");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 20:39:08

hdu1716排列2(stl:next_permutation+优先队列)的相关文章

POJ 1833 排列【STL/next_permutation】

题目描述: 大家知道,给出正整数n,则1到n这n个数可以构成n!种排列,把这些排列按照从小到大的顺序(字典顺序)列出,如n=3时,列出1 2 3,1 3 2,2 1 3,2 3 1,3 1 2,3 2 1六个排列. 任务描述: 给出某个排列,求出这个排列的下k个排列,如果遇到最后一个排列,则下1排列为第1个排列,即排列1 2 3…n. 比如:n = 3,k=2 给出排列2 3 1,则它的下1个排列为3 1 2,下2个排列为3 2 1,因此答案为3 2 1. Input 第一行是一个正整数m,表示

hdu 1716 排列2(stl next_permutation)

http://acm.hdu.edu.cn/showproblem.php?pid=1716 考到题目直接套 next_permutation 没有注意到0不能为首位 结果wa了一整天 输出结构也略有些小坑 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> using namespace std; int num[10

打印全排列和stl::next_permutation

打印全排列是个有点挑战的编程问题.STL提供了stl::next_permutation完美的解决了这个问题. 但是,如果不看stl::next_permutation,尝试自己解决,怎么做? 很自然地,使用递归的办法: 1. 单个元素的排列只有1个. 2. 多个元素的排列可以转化为: 以每个元素为排列的首个元素,加上其他元素的排列. 有了思路,就可以编码了. 第一个版本: void printAllPermutations(const std::string& prefix, int set[

白话 STL next_permutation 原理

翻译自stackoverflow 英语好的同学可以自己去看一下. 什么是next permutation 下面是四个元素{1,2,3,4}的排列 1 2 3 4 1 2 4 3 1 3 2 4 1 3 4 2 1 4 2 3 1 4 3 2 2 1 3 4 ... 每一行都是一个排列. 我们如何从一个排列转到下一个排列呢?我们可以将如上4个数的排列当做一个数.每一个数的下一个排列就是发现下一个比它大的数. next_permutation就是寻找这些元素所组成的数字的升序排列中的下一个数. 比较

STL next_permutation排列

概念 全排列的生成算法有很多种,有递归遍例,也有循环移位法等等.C++/STL中定义的next_permutation和prev_permutation函数则是非常灵活且高效的一种方法,它被广泛的应用于为指定序列生成不同的排列.本文将详细的介绍prev_permutation函数的内部算法. 按照STL文档的描述,next_permutation函数将按字母表顺序生成给定序列的下一个较大的序列,直到整个序列为减序为止.prev_permutation函数与之相反,是生成给定序列的上一个较小的序列

STL next_permutation 算法原理和自行实现

目标 STL中的next_permutation 函数和 prev_permutation 两个函数提供了对于一个特定排列P,求出其后一个排列P+1和前一个排列P-1的功能. 这里我们以next_permutation 为例分析STL中实现的原理,prev_permutation 的原理与之类似,我们在最后给出它们实现上差异的比较 问题: 给定一个排列P,求出其后一个排列P+1是什么. 思路 按照字典序的定义不难推出,正序,是一组排列中最小的排列,而逆序,则是一组排列中最大的排列. 从字典序的定

STL 之 优先队列(priority_queue)

1.什么是优先队列 能够完成下列两种操作的数据结构,我们便称之为优先队列. ①插入一个数值    ②取出最大(或者最小)的数值(获取数值,并且删除). 从严格意义上来说优先队列,并不是队列,因为它并不遵循队列的FIFO(先进先出的原则). 2.实现优先队列 我们可以使用一种叫做"堆(heap)"的数据结构来实现优先队列.堆有一个重要的性质就是儿子的值一定不小于父亲.除此之外,树的节点是从上到下.从左到右的顺序紧凑排列的.堆就是如下图的二叉树, 不知道是什么是二叉树的同学请移步:传送门

C++ STL next_permutation函数

在STL中,除了next_permutation外,还有一个函数prev_permutation,两者都是用来计算排列组合的函数.前者是求出下一个排列组合,而后者是求出上一个排列组合.所谓"下一个"和"上一个",书中举了一个简单的例子:对序列 {a, b, c},每一个元素都比后面的小,按照字典序列,固定a之后,a比bc都小,c比b大,它的下一个序列即为{a, c, b},而{a, c, b}的上一个序列即为{a, b, c},同理可以推出所有的六个序列为:{a,

【全排列】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 对每组卡片按从小到