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 --> 全排列的更多相关文章

  1. HDU 6351.Beautiful Now-暴力、全排列、思维 (2018 Multi-University Training Contest 5 1002)

    2018 Multi-University Training Contest 5 6351.Beautiful Now 题意就是交换任意两个数字,问你交换k次之后的最小值和最大值. 官方题解: 哇塞, ...

  2. 非递归全排列 python实现

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

  3. 2016A06寒假作业 全排列

    又是一个全排列哈, 注意注意,这个题不是十三个数字都需要,但原理是一样的 一开始把for的边界写错了(每次其实应该从k开始,还没看出来orz) #include <iostream> #i ...

  4. FCC(ES6写法) No repeats please

    把一个字符串中的字符重新排列生成新的字符串,返回新生成的字符串里没有连续重复字符的字符串个数.连续重复只以单个字符为准. 例如, aab 应该返回 2 因为它总共有6中排列 (aab, aab, ab ...

  5. 全排列算法(字典序法、SJT Algorithm 、Heap's Algorithm)

    一.字典序法 1) 从序列P的右端开始向左扫描,直至找到第一个比其右边数字小的数字,即. 2) 从右边找出所有比大的数中最小的数字,即. 3) 交换与. 4) 将右边的序列翻转,即可得到字典序的下一个 ...

  6. 【Data Structure & Algorithm】字符串全排列

    字符串全排列 题目:输入一个字符串,打印出该字符串的所有排列.例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab.cba. 分析:考察对递归的理 ...

  7. poj3187-Backward Digit Sums(枚举全排列)

    一,题意: 输入n,sum,求1~n的数,如何排列之后,相邻两列相加,直到得出最后的结果等于sum,输出1~n的排列(杨辉三角)  3 1 2 4 //1~n 全排列中的一个排列  4 3 6  7 ...

  8. 关于全排列 next_permutation() 函数的用法

    这是一个c++函数,包含在头文件<algorithm>里面,下面是基本格式. 1 int a[]; 2 do{ 3 4 }while(next_permutation(a,a+n)); 下 ...

  9. 回溯法求n的全排列

    代码如下: #include <iostream> #include <algorithm> #include <stdio.h> #include <cst ...

随机推荐

  1. IDirectDraw接口

    创建一个主DirectDraw对象,并使用QueryInterface()方法来得到最新的IDirectDraw7接口,或是直接用DirectDrawCreateEx()函数直接创建一个DirectD ...

  2. 如何使用DirectDraw直接显示RGB、YUV视频数据(播放yuv)

    #include "draw.h"void CTest100Dlg::OnButton1() { // TODO: Add your control notification ha ...

  3. JDBC异常总结

    1.异常一 (1)详情如下 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source reje ...

  4. am335x在ubuntu下使用StarterWare编写裸机程序并在CCS中用Jlink调试

    StarterWare在AM335X上的烧录运行 步骤:1.下载安装StarterWare,我们团购的SK需要02.00.00.07版本.最近外网访问慢,我上传到论坛.2.找一张miniSD卡,不需要 ...

  5. freemarker报错之七

    1.错误描述 五月 30, 2014 11:33:57 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template proc ...

  6. java中的“\t”

    对于初学者来说,java中的"\t"和空格总是让人迷惑,其实很简单,通过一个例子就能很快明白! 比如说打印九九乘法表! 先来看用空格的效果! package cn.edu.nwpu ...

  7. bzoj 4026 dC Loves Number Theory

    把我写吐了 太弱了 首先按照欧拉函数性质 我只需要统计区间不同质数个数就好了 一眼主席树 其次我被卡了分解质因数这里 可以通过质数筛时就建边解决 不够灵性啊,不知道如何改 #include<bi ...

  8. JustMock .NET单元测试利器(二)JustMock基础

    JustMock API基础 Mock是Telerik®JustMock框架中的主要类.Mock用于创建实例和静态模拟,安排和验证行为. 本文将介绍 "Mock"的基本用法: 首先 ...

  9. ubuntu安装latex

    1 终端中输入"sudo apt-get install texlive-full",输入root密码. 若不想安装所有文件,可以选择"sudo apt-get inst ...

  10. C#抽象方法与抽象实例--C#基础

    1.抽象方法与抽象类的声明 1)抽象类和抽象方法声明必须包含abstract 2)抽象方法的声明没有方法体:public abstract void fly(); 3)抽象类和抽象法前加上public ...