1 #include<iostream>
  2 using namespace std;
  3 //初始化,注意两边的初始化,简化算法
  4 void Init(int n , int *arr , bool * flags)
  5 {
  6     arr[0] = 0xfffffff;
  7     for(int i = 1;i <= n;i++)
  8     {
  9         arr[i] = i;
 10         flags[i] = false;
 11     }
 12     arr[n+1] = 0xfffffff;
 13 }
 14 //检查是否有可移动的地方
 15 bool HaveMove(const int * arr ,const int iLength , int & iIndex ,const bool * flags , bool & bTemp)
 16 {
 17     int iMax = -1;
 18     int iTemp;
 19     for(int i = 1 ;i <= iLength ;i ++)
 20     {
 21         if(flags[i] == false && arr[i] > arr[i-1] && arr[i] > iMax)
 22         {
 23             iTemp = i;
 24             iMax = arr[i];
 25             bTemp = false;
 26         }
 27         else if(flags[i] == true && arr[i] > arr[i+1] && arr[i] > iMax)
 28         {
 29             iTemp = i;
 30             iMax = arr[i];
 31             bTemp = true;
 32         }
 33     }
 34     if(iMax != -1)
 35     {
 36         iIndex = iTemp;
 37         return true;
 38     }
 39     else
 40     {
 41         return false;
 42     }
 43 }
 44 //相应的改变
 45 void Move(int *arr ,int i , bool * flags , bool bTemp , int iLength)
 46 {
 47     int iTemp;
 48     if( bTemp == false)
 49     {
 50         iTemp = flags[i];
 51         flags[i] = flags[i-1];
 52         flags[i-1] = iTemp;
 53
 54         iTemp = arr[i];
 55         arr[i] = arr[i-1];
 56         arr[i-1] = iTemp;
 57     }
 58     else
 59     {
 60         iTemp = flags[i];
 61         flags[i] = flags[i+1];
 62         flags[i+1] = iTemp;
 63
 64         iTemp = arr[i];
 65         arr[i] = arr[i+1];
 66         arr[i+1] = iTemp;
 67     }
 68
 69     for(int i = 1;i <= iLength;i ++)
 70     {
 71         if(arr[i] > iTemp)
 72         {
 73             flags[i] = (flags[i] == false ? true : false);
 74         }
 75     }
 76 }
 77 void Show(const int * arr,int iLength)
 78 {
 79     for(int i = 1;i <= iLength ;i++)
 80     {
 81         cout<<(char)arr[i] <<' ';
 82     }
 83     cout<<endl;
 84 }
 85 //算法名称
 86 void JonhnsonTrotter(int n)
 87 {
 88     int arr[100];
 89     bool flags[100];
 90     int iIndex;
 91     bool bTemp;
 92     Init( n , arr ,flags);
 93
 94     Show(arr , n);
 95     while(HaveMove(arr, n , iIndex , flags , bTemp))
 96     {
 97         Move(arr ,iIndex , flags , bTemp , n);
 98         Show(arr , n);
 99     }
100     return;
101 }
102
103 int main()
104 {
105     int iNum;
106     cin>>iNum;
107     JonhnsonTrotter(iNum);
108     return 0;
109 }

View Code

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 //插入--分为需要移动和无需移动元素两种情况
 5 void Insert(int iIndex , int iPreLength , int * arr)
 6 {
 7     int i;
 8     if(iIndex < iPreLength)
 9     {
10         for(i = iPreLength ;i > iIndex; i--)
11         {
12             arr[i] = arr[i-1];
13         }
14         arr[i] = iPreLength + 1;
15     }
16     else
17     {
18         arr[iPreLength] = iPreLength + 1;
19     }
20 }
21 //回溯--撤销之前的移动
22 void Back(int iIndex , int iPreLength , int * arr )
23 {
24     if(iIndex < iPreLength)
25     {
26         for(int i = iIndex ;i <= iPreLength ;i ++)
27         {
28             arr[i] = arr[i+1];
29         }
30     }
31 }
32 //生成算法,已经有前now个元素,第now+1个元素插在哪里的问题
33 void GetArray(int num , int now ,int arr[10])
34 {
35     if(num == now)
36     {
37         for(int i = 0;i < num ;i ++)
38         {
39             printf("%c " , arr[i]);
40         }
41         printf("\r\n");
42         return ;
43     }
44     else
45     {
46         for(int i = 0 ;i <= now ;i ++)
47         {
48             Insert(i , now, arr);
49             GetArray(num , now + 1 , arr);
50             Back(i , now , arr);
51         }
52     }
53 }
54 int main()
55 {
56     int arr[10];
57     memset(arr, 0 ,sizeof(arr));
58     arr[0] = 1;
59     GetArray(4 , 1 , arr);
60     return 0;
61 }

View Code

//字典序
#include<iostream>
using namespace std;
//反转某一区间
void reverse(char* a, int i  ,int j )
{char temp;while(i != j && i != --j){temp = a[j];a[j] = a[i];a[i] = temp;i++;}
}
//只有实现,详细可百度
bool Permutation(char * a ,int N)
{if(0 == N || 1 == N){return false;}int i = N - 2;char temp;while(true){if(a[i] < a[i+1]){int j =  N - 1;while(!(a[i] < a[j])){j--;}temp = a[i];a[i] = a[j];a[j] = temp;reverse(a , i + 1, N);return true;}if(0 == i){reverse(a, 0 , N);return false;}i--;}
}
int main()
{char a[] = {1,2,3,4};int size = sizeof(a) / sizeof(char);for(int i = 0;i < size ;i ++){printf("%c" , a[i]);}printf("\n");while(Permutation(a,size)){for(int i = 0;i < size ;i ++){printf("%c" , a[i]);}printf("\n");}return 0;
}

View Code

转载于:https://www.cnblogs.com/KIKIKS/p/4534728.html

排列生成算法--C++相关推荐

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

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

  2. hdu1716 排列2(排列生成算法)

     Problem Description Ray又对数字的列产生了兴趣: 现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数. Input 每组数据占一行,代表 ...

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

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

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

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

  5. 生成所有错位排列的算法

    所谓N元错位排列,就是指对应于1,2,–,N的N元排列Im(m=1,2,-,N),满足Im!=m,算法的目的是构造出所有这样的错位排列,依据的基本思想是回溯法,在沿栈向下试探的过程中逐步扩大部分错位排 ...

  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 ...

最新文章

  1. Vijos P1131 最小公倍数和最大公约数问题【暴力】
  2. 昨天帮同学的学校写了首校歌
  3. 【算法大赛直播周】如何赋予机器更多“想象力”?《计算广告》作者刘鹏带你解密深度学习
  4. [IE 技巧] 输入错误网址自动转到搜索引擎的功能选项
  5. 如何从iPhoto检索丢失的照片?
  6. ubuntu下载chrome等软件
  7. 【多多情报通】拼多多个人店铺怎么升级为企业店铺?怎么转让?
  8. 怎样在中国消灭IE6浏览器
  9. wps中怎么在奇数页的页眉中设置整本书的标题,而在偶数页中设置该章的标题,同时请问怎样修改页码的字体?
  10. Pycharm Debug调试(纯干货)
  11. scrapy 爬虫框架及链家租房信息爬取示例
  12. 四、共阳数码管的动态显示
  13. OCSP 在SSL证书中起什么作用
  14. html动态图片怎么设背景,微信8.0状态背景视频怎么设置?状态视频动态背景图设置教程[多图]...
  15. 巧学活用html4,新人教英语巧学活用必修一.docx
  16. DDD领域驱动设计(DP、Entity介绍;DDD实现流程;DDD聚合Aggregate;限界上下文(Bounded Context))
  17. 有趣的程序代码c语言,一个有趣的小程序
  18. DDoS防御服务器应该如何选择?
  19. 提升企业团队凝聚力的四步法
  20. Rasbian系统 树莓派Python环境搭建

热门文章

  1. 计算机一级考试第一套题电子表格,计算机等级考试一级上机试题(第一套)
  2. 佛罗里达大学计算机专业世界排名,2020年佛罗里达大学排名TFE Times美国最佳计算机科学硕士专业排名第55...
  3. VisualStudio安装
  4. 为什么索引不支持模糊查询_百度站长平台查询的关键词排名,为什么与实际不符合?...
  5. 小程序复制内容至剪贴板
  6. flash推荐助手怎么关掉_彻底清除“FF新推荐”“Flash助手”的弹出广告
  7. ubuntu cmake安装_如何在Emacs中得到一个真正的Terminal?vterm安装指南
  8. 用计算机写作400字,电脑的自述作文400字(通用4篇)
  9. php 类 private,有关php类的private属性继承问题详解
  10. linux中用户 机器名,Python 在linux下获得当前工作目录,主机名,用户名,操作系统平台等信息...