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];
int main()
{
    int mark=0;
    while(scanf("%d%d%d%d",&num[0],&num[1],&num[2],&num[3])!=EOF)
    {
        if(num[0]==0&&num[1]==0&&num[2]==0&&num[3]==0)  break;
        if(mark==1) printf("\n");
        if(mark==0) mark++;

        sort(num,num+4);
        int first,i;
        while(num[0]==0)
        {
            next_permutation(num,num+4);
        }
        first=num[0];
        int flag=0;
        do
        {
            if(first!=num[0])
            {
                    first=num[0];
                    flag=0;
                    printf("\n");
            }
            if(first==num[0]&&flag!=0)
            {
                printf(" ");
            }
            for(int i=0;i<4;i++) printf("%d",num[i]);
            flag++;
        }while(next_permutation(num,num+4));
        printf("\n");
    }
    return 0;
}

离线处理

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int num[10000][10];
int main()
{
    int coun=0;

    while(1)
    {
        scanf("%d%d%d%d",&num[coun][0],&num[coun][1],&num[coun][2],&num[coun][3]);
        if(num[coun][0]==0&&num[coun][1]==0&&num[coun][2]==0&&num[coun][3]==0)
        break;
        coun++;
    }

    for(int k=0;k<coun;k++)
    {
        sort(num[k],num[k]+4);
        int first,i;
        while(num[k][0]==0)
        {
            next_permutation(num[k],num[k]+4);
        }
        first=num[k][0];
        int flag=0;
        do
        {
            if(first!=num[k][0])
            {
                    first=num[k][0];
                    flag=0;
                    printf("\n");
            }
            if(first==num[k][0]&&flag!=0)
            {
                printf(" ");
            }
            for(int i=0;i<4;i++) printf("%d",num[k][i]);
            flag++;
        }while(next_permutation(num[k],num[k]+4));
        printf("\n");
        if(k!=coun-1)
            printf("\n");
    }
    return 0;
}

时间: 2024-12-16 01:56:33

hdu 1716 排列2(stl next_permutation)的相关文章

HDU 1716 排列2 (格式问题+排列)

题意:. 析:我们完全可以STL里面的函数next_permutation(),然后方便,又简单,这个题坑就是在格式上. 行末不能有空格,结尾不能有空行,不大好控制,必须控制好第一次数. 这个题本应该用DFS的,去枚举,也挺简单的,在这就不说了. 代码如下: #include <iostream> #include <cstdio> #include <algorithm> #include <queue> #include <vector> #

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,表示

打印全排列和stl::next_permutation

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

hdu 1716(dfs)

题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=1716 排列2 Problem Description Ray又对数字的列产生了兴趣:现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数. Input 每组数据占一行,代表四张卡片上的数字(0<=数字<=9),如果四张卡片都是0,则输入结束. Output 对每组卡片按从小到大的顺序输出所有能由这四张卡片组成的4位数,千位数字相同的在同一行,同一行中每个四位数

白话 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就是寻找这些元素所组成的数字的升序排列中的下一个数. 比较

HDU 4941 Magical Forest STL

这明明就是给纯C选手的大杀器啊. 题意:给你k坐标,表示 X,Y 有值C,有 3种操作 1) 交换A,B两行 2) 交换A,B两列 3) 询问(A,B)的值 解题思路:map离散化 解题代码: // File Name: 1007.cpp // Author: darkdream // Created Time: 2014年08月12日 星期二 21时05分18秒 #include<vector> #include<list> #include<map> #includ

HDU 4864 Task (贪心+STL多集(二分)+邻接表存储)(杭电多校训练赛第一场1004)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4864 解题报告:有n台机器用来完成m个任务,每个任务有一个难度值和一个需要完成的时间,每台机器有一个可以工作的最长时间和一个可以完成的任务的难度的最大值, 一台机器能完成一个任务的条件是这台机器的最长工作时间和能完成任务的难度值必须都大于等于这个任务,而且一台机器最多完成一个任务,假设一个任务的时间为t,难度值为x,那么完成这个任务可以赚到的钱 money = 500 * t + 2 * x; 现在

HDU 4022 Bombing(stl,map,multiset,iterater遍历)

题目 参考了     1     2 #define _CRT_SECURE_NO_WARNINGS //用的是STL中的map 和 multiset 来做的,代码写起来比较简洁,也比较好容易理解. //multiset可以允许重复 //multiset<int>::iterator it; 用来遍历 #include<stdio.h> #include<string.h> #include<algorithm> #include<iostream&g

hdu 5366 排列组合

http://acm.hdu.edu.cn/showproblem.php?pid=5366 Problem Description ![](../../data/images/C613-1001-1.jpg) ZJiaQ want to become a strong man, so he decided to play the mook jong.ZJiaQ want to put some mook jongs in his backyard. His backyard consist o