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. php session 和cookie

    先简单的说明下session和cookie的区别. 1.session存放在服务器的文件中,或者是内存中.而cookie存在客服端. 2.session比cookie安全 3.session存放在服务 ...

  2. 利用PowerDesigner15在win7系统下对MySQL 进行反向工程(一)

    利用PowerDesigner15在win7系统下对MySQL 进行反向工程 1.首先,安装以下的驱动 2.找到"C:\Windows\System32" 3.双击"od ...

  3. Netty的并发编程实践5:不要依赖线程优先级

    当有多个线程同时运行的时候,由线程调度器来决定哪些线程运行.哪些等待以及线程切换的时间点,由于各个操作系统的线程调度器实现大相径庭,因此,依赖JDK自带的线程优先级来设置线程优先级策略的方法是错误和非 ...

  4. freemarker报错之五

    1.错误描述 freemarker.core.ParseException: Token manager error: freemarker.core.TokenMgrError: Lexical e ...

  5. freemarker写select组件报错总结(六)

    1.错误描述 六月 26, 2014 10:53:26 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template proc ...

  6. Jquery ajaxfileupload.js结合.ashx文件实现无刷新上传

    先上几张图更直观展示一下要实现的功能,本功能主要通过Jquery ajaxfileupload.js插件结合ajaxUpFile.ashx一般应用程序处理文件实现Ajax无刷新上传功能,结合NPOI2 ...

  7. TypeError:_12.store.query is not a function

    1.错误描述 TypeError:_12.store.query is not a function                              _SearchMixin.js(第62行 ...

  8. tcp_wrapper

    介绍 对基于tcp协议开发并提供服务的应用程序,所提供的一层访问控制工具 基于库调用实现其功能 * 库名:libwrap 判断服务是否能够由tcp_wrapper进行访问控制 1. 动态编译 ldd命 ...

  9. jquery 记住账号 记住密码

    <body> <label><input type="checkbox" onclick="loginBtn_user()" /& ...

  10. redis和spring整合使用

    第一步,在项目中加入redis的pom代码: <dependency> <groupId>redis.clients</groupId> <artifactI ...