Algorithm -- 全排列
1、算法简述
简单地说:全排列就是从第一个数字起每个数分别与它后面的数字交换。
E.g:E = (a , b , c),则 prem(E)= a.perm(b,c)+ b.perm(a,c)+ c.perm(a,b)
然后a.perm(b,c)= ab.perm(c)+ ac.perm(b)= abc + acb.依次递归进行。
#include<iostream> using namespace std;void Swap(char *a,char *b) {char tmp=*a;*a=*b;*b=tmp; }void AllRange(char *pszStr,int k,int m) {if(k==m){static int s_i=1;printf("%s\n",s_i++,pszStr); }else{for(int i=k;i<=m;i++){Swap(pszStr+i,pszStr+k);AllRange(pszStr,k+1,m);Swap(pszStr+i,pszStr+k);}} }void Foo(char *pszStr) {AllRange(pszStr,0,strlen(pszStr)-1); }int main() { printf("全排列的递归实现:\n"); char szTextStr[] = "123"; printf("%s的全排列如下:\n", szTextStr); Foo(szTextStr); system("pause");return 0; }
结果:
全排列的递归实现: 123的全排列如下: 123 132 213 231 321 312
如果输入122:,结果为
全排列的递归实现: 122的全排列如下: 122 122 212 221 221 212
显然不符合题目要求。
2、代码改进
去掉重复符号的全排列:在交换之前可以先判断两个符号是否相同,不相同才交换,这个时候需要一个判断符号是否相同的函数。
#include<iostream> using namespace std;void Swap(char *a,char *b) {char tmp=*a;*a=*b;*b=tmp; }//在pszStr数组中,[nBegin,nEnd)中是否有数字与下标为nEnd的数字相等 bool IsSwap(char *pszStr, int nBegin, int nEnd) { for (int i = nBegin; i < nEnd; i++) if (pszStr[i] == pszStr[nEnd]) return false; return true; } //k表示当前选取到第几个数,m表示共有多少数. void AllRange(char *pszStr,int k,int m) {if(k==m){static int s_i=1;printf("%s\n",s_i++,pszStr); }else{for(int i=k;i<=m;i++){if (IsSwap(pszStr,k,i)){Swap(pszStr+i,pszStr+k);AllRange(pszStr,k+1,m);Swap(pszStr+i,pszStr+k);} }} }void Foo(char *pszStr) {AllRange(pszStr,0,strlen(pszStr)-1); }int main() { printf("全排列的递归实现:\n"); char szTextStr[] = "122"; printf("%s的全排列如下:\n", szTextStr); Foo(szTextStr); system("pause");return 0; }
结果如下:
全排列的递归实现: 122的全排列如下: 122 212 221
转载于:https://www.cnblogs.com/jeakeven/p/4589722.html
Algorithm -- 全排列相关推荐
- Python 非递归方法的全排列
python algorithm 全排列(Permutation) 排列 (Permutation)是将相异物件或符号根据确定的顺序重排.每个顺序都称作一个排列. 例如,从一到六的数字有720种排列, ...
- P1008 [NOIP1998 普及组] 三连击 题解
P1008 [NOIP1998 普及组] 三连击 题解 题目背景 本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序. 题目描述 将 1, 2, - , 9 ...
- 蓝桥杯C/C++ AB组辅导课
文章目录 注意 algorithm 字符串 剪枝 暴力常识 1S时间复杂度 数论 暴力流打法 二进制巧用 归并排序 并查集(查找图中的环) 线段树 大数 国赛准备注意事项 还愿 后记 注意 注意数据范 ...
- Algorithm:C++语言实现之字符串相关算法(字符串的循环左移、字符串的全排列、带有同个字符的全排列、串匹配问题的BF算法和KMP算法)
Algorithm:C++语言实现之字符串相关算法(字符串的循环左移.字符串的全排列.带有同个字符的全排列.串匹配问题的BF算法和KMP算法) 目录 一.字符串的算法 1.字符串的循环左移 2.字符串 ...
- Algorithm of permutation(全排列算法)
STL有全排列函数next_permutation:传送门 不过还是自己写写比较好啊~ 自己写全排列: #include <iostream> #include <algorithm ...
- 蓝桥杯 扑克序列(全排列)
扑克序列 A A 2 2 3 3 4 4, 一共4对扑克牌.请你把它们排成一行. 要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌. 请填写出所有符合要求的排列中, ...
- 【Codeforces】908B New Year and Buggy Bot(暴力+全排列)
http://codeforces.com/contest/908/problem/B 0 1 2 3 可以对应 上下左右.(具体哪个对应哪个,试过才知道) str 的 长度 为 100,0 1 2 ...
- 【ACM】与全排列相关的STL函数 prev_permutation next_permutation
排列 与 全排列 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列. 当m=n时所有的排列情况叫全排列.如果这组数有n个,那么全排列数为n ...
- [通用技术]在不同语言中用协程实现全排列算法(C++/Lua/Python/C#)
我这里实现全排列的基本算法如下(C++): 1 #include <algorithm> 2 #include <iostream> 3 #include <vector ...
最新文章
- 30分钟搞定数据竞赛刷分夺冠神器LightGBM!
- 实现DataGridView和DevExpress.GridControl表头全选功能
- 『宝藏 状态压缩DP NOIP2017』
- 支持向量机(理论+opencv实现)
- 转载-- http接口、api接口、RPC接口、RMI、webservice、Restful等概念
- Ubuntu 使用记录
- getHibernateTemplate()(Spring中常用的hql查询方法)
- 汽车平顺性与仿真分析matlab,基于matlab的汽车平顺性的建模与仿真.docx
- SQL Server中,varchar和nvarchar如何选择
- Docker学习总结(45)——Docker在沪江落地的实践
- UDS(ISO14229)诊断服务功能及描述完结篇
- 安兔兔软件测试手机准确吗,安兔兔验机准吗? 安兔兔验机中心新版使用评测
- Oracle VM VirtualBox Ubuntu1804虚拟机磁盘扩容
- 6.29--6.30郭天祥老师课程中的一些错误与我的存疑
- 2019 年终总结,168 篇,已归类!
- excel公式编辑器_V14.0发布:组件化编辑器+数据透视表
- 智行买机票如何在线选座
- 真人口播视频号:流量不愁,变现才是重中之重丨国仁网络
- (doc, docx)文档合并的三种方法
- SAP FREE_SELECTIONS_INIT多表动态选择演示
热门文章
- cookie代码加时间多久出现一次_一文彻底搞懂Cookie、Session、Token到底是什么
- 3dmax高版本转低版本插件_Fundebug前端JavaScript插件更新至1.8.0,兼容低版本的Android浏览器...
- 计算机三级标题,计算机三级考试题目
- mysql ip地址查询 优化_mysql数据库字段(ip地址,时间)优化
- java integer 不变模式_《JAVA与模式》之不变模式
- vue 实现文本的拖拽_Vue-实现简单拖拽(自定义属性)
- linux ps用法大全,linux 性能篇 -- ps的用法
- MVC与三层架构讲解
- 二叉搜索树(Binary Search Tree)(Java实现)
- 我是如何解决jobtracker.info could only be replicated to 0 nodes, instead of 1这个问题的