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=;
printf("%s\n",s_i++,pszStr);
}
else
{
for(int i=k;i<=m;i++)
{
Swap(pszStr+i,pszStr+k);
AllRange(pszStr,k+,m);
Swap(pszStr+i,pszStr+k);
}
}
} void Foo(char *pszStr)
{
AllRange(pszStr,,strlen(pszStr)-);
} int main()
{
printf("全排列的递归实现:\n");
char szTextStr[] = "";
printf("%s的全排列如下:\n", szTextStr);
Foo(szTextStr);
system("pause");
return ;
}
结果:
全排列的递归实现:
123的全排列如下:
如果输入122:,结果为
全排列的递归实现:
122的全排列如下:
显然不符合题目要求。
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=;
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+,m);
Swap(pszStr+i,pszStr+k);
}
}
}
} void Foo(char *pszStr)
{
AllRange(pszStr,,strlen(pszStr)-);
} int main()
{
printf("全排列的递归实现:\n");
char szTextStr[] = "";
printf("%s的全排列如下:\n", szTextStr);
Foo(szTextStr);
system("pause");
return ;
}
结果如下:
全排列的递归实现:
122的全排列如下:
Algorithm --> 全排列的更多相关文章
- HDU 6351.Beautiful Now-暴力、全排列、思维 (2018 Multi-University Training Contest 5 1002)
2018 Multi-University Training Contest 5 6351.Beautiful Now 题意就是交换任意两个数字,问你交换k次之后的最小值和最大值. 官方题解: 哇塞, ...
- 非递归全排列 python实现
python algorithm 全排列(Permutation) 排列(英语:Permutation)是将相异物件或符号根据确定的顺序重排.每个顺序都称作一个排列.例如,从一到六的数字有720种排列 ...
- 2016A06寒假作业 全排列
又是一个全排列哈, 注意注意,这个题不是十三个数字都需要,但原理是一样的 一开始把for的边界写错了(每次其实应该从k开始,还没看出来orz) #include <iostream> #i ...
- FCC(ES6写法) No repeats please
把一个字符串中的字符重新排列生成新的字符串,返回新生成的字符串里没有连续重复字符的字符串个数.连续重复只以单个字符为准. 例如, aab 应该返回 2 因为它总共有6中排列 (aab, aab, ab ...
- 全排列算法(字典序法、SJT Algorithm 、Heap's Algorithm)
一.字典序法 1) 从序列P的右端开始向左扫描,直至找到第一个比其右边数字小的数字,即. 2) 从右边找出所有比大的数中最小的数字,即. 3) 交换与. 4) 将右边的序列翻转,即可得到字典序的下一个 ...
- 【Data Structure & Algorithm】字符串全排列
字符串全排列 题目:输入一个字符串,打印出该字符串的所有排列.例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab.cba. 分析:考察对递归的理 ...
- poj3187-Backward Digit Sums(枚举全排列)
一,题意: 输入n,sum,求1~n的数,如何排列之后,相邻两列相加,直到得出最后的结果等于sum,输出1~n的排列(杨辉三角) 3 1 2 4 //1~n 全排列中的一个排列 4 3 6 7 ...
- 关于全排列 next_permutation() 函数的用法
这是一个c++函数,包含在头文件<algorithm>里面,下面是基本格式. 1 int a[]; 2 do{ 3 4 }while(next_permutation(a,a+n)); 下 ...
- 回溯法求n的全排列
代码如下: #include <iostream> #include <algorithm> #include <stdio.h> #include <cst ...
随机推荐
- 使用wordpress搭建独立域名的个人博客或网站
最近抽空闲时间搭建了一个独立域名的个人博客站点,基本过程如下: 一.准备工作: 1.准备一个独立的域名,我是从万网中注册的cn结束的域名:tuzongxun.cn,价格29元,根据个人选择,也有更高更 ...
- HI3531的nand flash测试
void NAND_Init() { *(unsigned int *)(0x20030000 + 0xd0) = 7; delay_x(0X5000); *(unsigned int * ...
- C语言中的可变参数函数的浅析(以Arm 程序中的printf()函数实现为例) .
我们在C语言编程中会遇到一些参数个数可变的函数,一般人对它的实现不理解.例如Printf(): Printf()函数是C语言中非常常用的一个典型的变参数函数,它 的原型为: int printf( c ...
- IE浏览器因缓存问题未能成功向后端发送请求的几个解决办法
这段时间前后端联调,解决IE.谷歌等浏览器兼容问题,真是让人有点焦头烂额,各种奇葩问题层出不穷,旧问题刚去,新麻烦又来,其中尤其以IE浏览器缓存的问题最多.有若干次都是因为这个缓存,使得前端的请求没有 ...
- stm32开发之标准库的介绍
1 STM32标准外设库概述 STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序.数据结构和宏组成,包括了微控制器所有外设的性能特征.该函数库还包括每一个外设的驱动描 ...
- freemarker自定义标签报错(一)
freemarker自定义标签 1.错误描述 freemarker.core.ParseException: Token manager error: freemarker.core.TokenMgr ...
- “var arr = []; ”和 “var arr = {};” 的区别
1.面试题 var arr = []; var arr = {}; 比较上述代码有什么区别? 2.解析 var arr = [];是一个数组对象 var arr = {} ...
- ASP.NET WebAPI String 传值问题
如果我们再WebAPI中定义了只有一个string参数的WebAPI函数,如下所示: [HttpPost] public string TrackBill(string str) { return s ...
- C#图解教程 第十七章 泛型
泛型 什么是泛型 一个栈的示例 C#中的泛型 继续栈示例 泛型类声明泛型类创建构造类型创建变量和实例 使用泛型的栈的示例比较泛型和非泛型栈 类型参数的约束 Where子句约束类型和次序 泛型方法 声明 ...
- 5 分钟让你秒懂 Docker !
Docker是啥? 打开翻译君输入Docker 结果显示码头工人,没错!码头工人搬运的是集装箱,那么今天要讲的Docker其操作的也是集装箱,这个集装箱就静态而言就是一个应用镜像文件,就动态而言,就是 ...