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 43211123 1132 1213 1231 1312 1321 2113 2131 2311 3112 3121 32111023 1032 1203 1230 1302 1320 2013 2031 2103 2130 2301 2310 3012 3021 3102 3120 3201 3210
题意:给出4张卡片,第张卡片上的数为o-9之间,求构成的4位数的所有排列(当然不能有前导0)
思路:第一种直接使用STL中的next_permutation算法,第二种使用字典序生成排列算法
字典序生成排列算法思想
(1)假设当前序列为a1a2a3...an,从后往前找到ai<ai+1,记录下当前的i,
(2)从右到左找到aj>ai,替换ai和aj,然后将从i+1 到最后公位置从小到大排列
(3)直接找不到满足条件的i为止
第一种解法代码如下
#include <cstdio>
#include <algorithm>using namespace std;const int N = 4;int a[N];
int cs = 0;bool input()
{int sum = 0;for (int i = 0; i < N; i++) {scanf("%d", &a[i]);sum += a[i];}if (sum == 0) return false;return true;
}void solve()
{if (cs) printf("\n");cs++;sort(a, a + N);bool flag = true;int prev = -1;do {if (a[0] == 0) continue;//表示第一行的第一个if (flag) {flag = false;for (int i = 0; i < N; i++) {printf("%d", a[i]);}} else if (a[0] == prev) {printf(" ");for (int i = 0; i < N; i++) {printf("%d", a[i]);}} else {printf("\n");for (int i = 0; i < N; i++) {printf("%d", a[i]);}}prev = a[0];} while (next_permutation(a, a + N));printf("\n");
}int main()
{
#ifndef ONLINE_JUDGEfreopen("f:\\OJ\\uva_in.txt", "r", stdin);
#endifwhile (input()) {solve();}return 0;
}

第二种解法(字典序生成法)代码如下
import java.io.FileInputStream;
import java.io.OutputStreamWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Scanner;
import java.util.Arrays;public class Main implements Runnable
{  private static final boolean DEBUG = false;private Scanner cin;private PrintWriter cout;private static final int N = 4;private static final int[] a = new int[N];private int cs = 0;private void init(){try {if (DEBUG) {cin = new Scanner(new InputStreamReader(new FileInputStream("f:\\OJ\\uva_in.txt")));} else {cin = new Scanner(new InputStreamReader(System.in));}cout = new PrintWriter(new OutputStreamWriter(System.out));} catch (Exception e) {e.printStackTrace();}  }private boolean input(){int sum = 0;for (int i = 0; i < N; i++) {a[i] = cin.nextInt();sum += a[i];}if (sum == 0) return false;return true;}private boolean next_permutation(int[] array){int len = array.length;int i = len - 1, j;while (true) {j = i;i--;if (array[i] < array[j]) {int k = len - 1;while (!(array[i] < array[k])) k--;int tmp = array[i];array[i] = array[k];array[k] = tmp;Arrays.sort(array, j, len);return true;}if (i == 0) {Arrays.sort(array);return false;}}}private void solve(){if (cs != 0) cout.println();cs++;Arrays.sort(a);boolean flag = true;int prev = 0;do {if (a[0] == 0) continue;if (flag) {flag = false;for (int i = 0; i < N; i++) {cout.print(a[i]);}} else if (a[0] == prev) {cout.print(" ");for (int i = 0; i < N; i++) {cout.print(a[i]);}} else {cout.println();for (int i = 0; i < N; i++) {cout.print(a[i]);}}prev = a[0];} while (next_permutation(a));cout.println();cout.flush();}@Overridepublic void run(){init();while (input()) {solve();}}public static void main(String[] args) {// TODO code application logic herenew Thread(new Main()).start();}
}

hdu1716 排列2(排列生成算法)相关推荐

  1. php 实现的字典序排列算法,字典序的一个生成算法

    字典序的一个生成算法. 最近在LeetCode刷题,刷到一个题,链接: https://leetcode-cn.com/problems/permutation-sequence/ 这个题要求得长度为 ...

  2. 【算法】组合数学——排列数生成算法详解(一)

    组合数学中的全排列深成算法历来是组合数学考试的重要考察点,因此在这里我简单的介绍一下6种全排列生成算法的详细过程,并借此比较它们之间的优劣之处. 不论是哪种全排列生成算法,都遵循着"原排列& ...

  3. 组合数学4-全排列生成算法

    文章目录 全排列生成算法 一 钟声里的全排列 **思考**:生成算法 二 字典序法 1.递归 2.字典序法 例1:生成字母abc的全排列 例2:生成123的全排列 例3:生成839647521的全排列 ...

  4. 排列生成算法--C++

    1 #include<iostream> 2 using namespace std; 3 //初始化,注意两边的初始化,简化算法 4 void Init(int n , int *arr ...

  5. 有序表A和B,其元素均按照从小到大升序排列,编写一个算法将它们合并成一个顺序表C,要求C的元素也是从小到大的升序排列。

    题目要求:有序表A和B,其元素均按照从小到大升序排列,编写一个算法将它们合并成一个顺序表C,要求C的元素也是从小到大的升序排列. 代码实现: void merge(SqList A,SqList B, ...

  6. 获取序列全排列Java,java中全排列的生成算法汇总

    全排列的生成算法就是对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来.任何n个字符集的排列都可以与1-n的n个数字的排列一一对应, 因此在此就以n个数字的排列为例说明排列的生成法 ...

  7. 全排列的生成算法:字典序法

    全排列的生成算法:字典序法    全排列的生成算法 对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来.     字典序法按照字典序求下一个排列的算法 生成给定全排列的下一个排列所 ...

  8. 递归方式-全排列生成算法

    http://blog.csdn.net/xiazdong/article/details/7986015 排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列: 全排列:当n==m时, ...

  9. c++中的STL的常用算法---3(排序算法,拷贝和替换算法,算术生成算法,集合算法)

    排序算法 merge() 以下是排序和通用算法:提供元素排序策略 merge: 合并两个有序序列,存放到另一个序列. #include<iostream>using namespace s ...

  10. 随机系列生成算法(随机数生成)

    1.问题描述 给定一个正整数n,需要输出一个长度为n的数组,数组元素是随机数,范围为0 – n-1,且元素不能重复.比如 n = 3 时,需要获取一个长度为3的数组,元素范围为0-2. 2.准备 首先 ...

最新文章

  1. 怎样做网络推广浅析网站被K之后,优化人员们要注意的方面是哪些?
  2. 2 - 4 - 实例:X86的中断与异常机制(9-48)
  3. python opencv图片旋转180度_Python opencv图像镜像翻转
  4. java 抽象属性 设计_Java 抽象类与模板设计模式详解
  5. 从 k8s 上卸载 KubeSphere
  6. 菲涅尔效应(Fresnel Effect)
  7. 高亮屏幕一条条线_惠普Z24N G2显示器评测 设计师都想要的好屏幕
  8. 求两个数的最小公约数和最小公倍数
  9. Transformer在计算机视觉领域走到哪了?
  10. 知识整理(你想要的Linux知识都在这里)
  11. HR面必知黑话!错过后悔!
  12. 《我的WCF之旅》博文系列汇总
  13. 牛客面经 | BAT、美团、360、滴滴新锐……2W字干货,这不仅仅是一篇面经
  14. 学计算机基础微课视频教程,计算机基础教学对微课的应用
  15. 联盟 (Alliances)
  16. X3D制作简易三维动画
  17. C语言基础——1024我把函数献给你
  18. 英伟达黄仁勋发布全球最大GPU,超300斤,汽车后备箱大小
  19. 2023网盘扩容技术
  20. java计时器_Java 计时器

热门文章

  1. struts2和spring的两种整合方式 action的自动装配
  2. 图形图像处理_c/c++
  3. python是一种通用编程语言-想自学一种编程语言,各种编程语言都有什么区别?...
  4. python详细安装步骤-Pycharm及python安装详细教程(图解)
  5. python课程推荐-课程推荐:四天人工智能 python入门体验课
  6. python基本语法语句-python 语法基础篇 一
  7. python爬虫requests-Python爬虫(requests模块)
  8. python从入门到精通书-Python从入门到精通,跟着《这本书》学就够了?
  9. python画直方图代码-python plotly画柱状图代码实例
  10. python画直方图代码-Python绘制直方图及子图的方法分析(代码示例)