排列生成算法--C++
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++相关推荐
- 组合数学4-全排列生成算法
文章目录 全排列生成算法 一 钟声里的全排列 **思考**:生成算法 二 字典序法 1.递归 2.字典序法 例1:生成字母abc的全排列 例2:生成123的全排列 例3:生成839647521的全排列 ...
- hdu1716 排列2(排列生成算法)
Problem Description Ray又对数字的列产生了兴趣: 现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数. Input 每组数据占一行,代表 ...
- 【算法】组合数学——排列数生成算法详解(一)
组合数学中的全排列深成算法历来是组合数学考试的重要考察点,因此在这里我简单的介绍一下6种全排列生成算法的详细过程,并借此比较它们之间的优劣之处. 不论是哪种全排列生成算法,都遵循着"原排列& ...
- php 实现的字典序排列算法,字典序的一个生成算法
字典序的一个生成算法. 最近在LeetCode刷题,刷到一个题,链接: https://leetcode-cn.com/problems/permutation-sequence/ 这个题要求得长度为 ...
- 生成所有错位排列的算法
所谓N元错位排列,就是指对应于1,2,–,N的N元排列Im(m=1,2,-,N),满足Im!=m,算法的目的是构造出所有这样的错位排列,依据的基本思想是回溯法,在沿栈向下试探的过程中逐步扩大部分错位排 ...
- 获取序列全排列Java,java中全排列的生成算法汇总
全排列的生成算法就是对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来.任何n个字符集的排列都可以与1-n的n个数字的排列一一对应, 因此在此就以n个数字的排列为例说明排列的生成法 ...
- 全排列的生成算法:字典序法
全排列的生成算法:字典序法 全排列的生成算法 对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来. 字典序法按照字典序求下一个排列的算法 生成给定全排列的下一个排列所 ...
- 递归方式-全排列生成算法
http://blog.csdn.net/xiazdong/article/details/7986015 排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列: 全排列:当n==m时, ...
- c++中的STL的常用算法---3(排序算法,拷贝和替换算法,算术生成算法,集合算法)
排序算法 merge() 以下是排序和通用算法:提供元素排序策略 merge: 合并两个有序序列,存放到另一个序列. #include<iostream>using namespace s ...
最新文章
- Vijos P1131 最小公倍数和最大公约数问题【暴力】
- 昨天帮同学的学校写了首校歌
- 【算法大赛直播周】如何赋予机器更多“想象力”?《计算广告》作者刘鹏带你解密深度学习
- [IE 技巧] 输入错误网址自动转到搜索引擎的功能选项
- 如何从iPhoto检索丢失的照片?
- ubuntu下载chrome等软件
- 【多多情报通】拼多多个人店铺怎么升级为企业店铺?怎么转让?
- 怎样在中国消灭IE6浏览器
- wps中怎么在奇数页的页眉中设置整本书的标题,而在偶数页中设置该章的标题,同时请问怎样修改页码的字体?
- Pycharm Debug调试(纯干货)
- scrapy 爬虫框架及链家租房信息爬取示例
- 四、共阳数码管的动态显示
- OCSP 在SSL证书中起什么作用
- html动态图片怎么设背景,微信8.0状态背景视频怎么设置?状态视频动态背景图设置教程[多图]...
- 巧学活用html4,新人教英语巧学活用必修一.docx
- DDD领域驱动设计(DP、Entity介绍;DDD实现流程;DDD聚合Aggregate;限界上下文(Bounded Context))
- 有趣的程序代码c语言,一个有趣的小程序
- DDoS防御服务器应该如何选择?
- 提升企业团队凝聚力的四步法
- Rasbian系统 树莓派Python环境搭建
热门文章
- 计算机一级考试第一套题电子表格,计算机等级考试一级上机试题(第一套)
- 佛罗里达大学计算机专业世界排名,2020年佛罗里达大学排名TFE Times美国最佳计算机科学硕士专业排名第55...
- VisualStudio安装
- 为什么索引不支持模糊查询_百度站长平台查询的关键词排名,为什么与实际不符合?...
- 小程序复制内容至剪贴板
- flash推荐助手怎么关掉_彻底清除“FF新推荐”“Flash助手”的弹出广告
- ubuntu cmake安装_如何在Emacs中得到一个真正的Terminal?vterm安装指南
- 用计算机写作400字,电脑的自述作文400字(通用4篇)
- php 类 private,有关php类的private属性继承问题详解
- linux中用户 机器名,Python 在linux下获得当前工作目录,主机名,用户名,操作系统平台等信息...