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 -- 全排列相关推荐

  1. Python 非递归方法的全排列

    python algorithm 全排列(Permutation) 排列 (Permutation)是将相异物件或符号根据确定的顺序重排.每个顺序都称作一个排列. 例如,从一到六的数字有720种排列, ...

  2. P1008 [NOIP1998 普及组] 三连击 题解

    P1008 [NOIP1998 普及组] 三连击 题解 题目背景 本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序. 题目描述 将 1, 2, - , 9 ...

  3. 蓝桥杯C/C++ AB组辅导课

    文章目录 注意 algorithm 字符串 剪枝 暴力常识 1S时间复杂度 数论 暴力流打法 二进制巧用 归并排序 并查集(查找图中的环) 线段树 大数 国赛准备注意事项 还愿 后记 注意 注意数据范 ...

  4. Algorithm:C++语言实现之字符串相关算法(字符串的循环左移、字符串的全排列、带有同个字符的全排列、串匹配问题的BF算法和KMP算法)

    Algorithm:C++语言实现之字符串相关算法(字符串的循环左移.字符串的全排列.带有同个字符的全排列.串匹配问题的BF算法和KMP算法) 目录 一.字符串的算法 1.字符串的循环左移 2.字符串 ...

  5. Algorithm of permutation(全排列算法)

    STL有全排列函数next_permutation:传送门 不过还是自己写写比较好啊~ 自己写全排列: #include <iostream> #include <algorithm ...

  6. 蓝桥杯 扑克序列(全排列)

    扑克序列 A A 2 2 3 3 4 4, 一共4对扑克牌.请你把它们排成一行. 要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌. 请填写出所有符合要求的排列中, ...

  7. 【Codeforces】908B New Year and Buggy Bot(暴力+全排列)

    http://codeforces.com/contest/908/problem/B 0 1 2 3 可以对应 上下左右.(具体哪个对应哪个,试过才知道) str 的 长度 为 100,0 1 2 ...

  8. 【ACM】与全排列相关的STL函数 prev_permutation next_permutation

    排列  与  全排列 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列. 当m=n时所有的排列情况叫全排列.如果这组数有n个,那么全排列数为n ...

  9. [通用技术]在不同语言中用协程实现全排列算法(C++/Lua/Python/C#)

    我这里实现全排列的基本算法如下(C++): 1 #include <algorithm> 2 #include <iostream> 3 #include <vector ...

最新文章

  1. 30分钟搞定数据竞赛刷分夺冠神器LightGBM!
  2. 实现DataGridView和DevExpress.GridControl表头全选功能
  3. 『宝藏 状态压缩DP NOIP2017』
  4. 支持向量机(理论+opencv实现)
  5. 转载-- http接口、api接口、RPC接口、RMI、webservice、Restful等概念
  6. Ubuntu 使用记录
  7. getHibernateTemplate()(Spring中常用的hql查询方法)
  8. 汽车平顺性与仿真分析matlab,基于matlab的汽车平顺性的建模与仿真.docx
  9. SQL Server中,varchar和nvarchar如何选择
  10. Docker学习总结(45)——Docker在沪江落地的实践
  11. UDS(ISO14229)诊断服务功能及描述完结篇
  12. 安兔兔软件测试手机准确吗,安兔兔验机准吗? 安兔兔验机中心新版使用评测
  13. Oracle VM VirtualBox Ubuntu1804虚拟机磁盘扩容
  14. 6.29--6.30郭天祥老师课程中的一些错误与我的存疑
  15. 2019 年终总结,168 篇,已归类!
  16. excel公式编辑器_V14.0发布:组件化编辑器+数据透视表
  17. 智行买机票如何在线选座
  18. 真人口播视频号:流量不愁,变现才是重中之重丨国仁网络
  19. (doc, docx)文档合并的三种方法
  20. SAP FREE_SELECTIONS_INIT多表动态选择演示

热门文章

  1. cookie代码加时间多久出现一次_一文彻底搞懂Cookie、Session、Token到底是什么
  2. 3dmax高版本转低版本插件_Fundebug前端JavaScript插件更新至1.8.0,兼容低版本的Android浏览器...
  3. 计算机三级标题,计算机三级考试题目
  4. mysql ip地址查询 优化_mysql数据库字段(ip地址,时间)优化
  5. java integer 不变模式_《JAVA与模式》之不变模式
  6. vue 实现文本的拖拽_Vue-实现简单拖拽(自定义属性)
  7. linux ps用法大全,linux 性能篇 -- ps的用法
  8. MVC与三层架构讲解
  9. 二叉搜索树(Binary Search Tree)(Java实现)
  10. 我是如何解决jobtracker.info could only be replicated to 0 nodes, instead of 1这个问题的