全排列递归算法
来源:互联网 发布:淘宝客服任职要求 编辑:程序博客网 时间:2024/05/16 15:30
我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致
这个算法的思想就是:1.固定第一个元素,剩下的全排形成一个解。2.该元素对应的解求完后,在下一个循环和第i个元素交换。这样每个元素都可以成为第一位的元素。每个循环结束后还原数组。3.然后把第一个元素不同的排列加起来就是全部的解。考虑三个元素ABC的全排,那么调用perm()递归的深度就是3+1=4第一层 第一次循环 i=0,k=0,m=3 swap(0,0)没效果 还是ABC perm(,1,3)开始对后两个元素全排 进入第二层递归!! 第一次循环 i=1,k=1,m=3 swap(1,1)无效果 perm(,2,3)最后一个元素全排 进入第三层递归!! swap(2,2)无效果 perm(,3,3) 进入第四层递归!! 打印结果 ABC!! 返回第三层递归!! swap(2,2)无效果,i自加得3,循环结束 返回第二层递归!! swap(1,1)无效果,i自加得2 第二次循环 i=2,k=1,m=3 swap(2,1)交换第二第三元素得 ACB 进入第三第四层递归打印结果 ACB!! swap(1,2)交换第二第三元素得 ABC i自加得3,循环结束 返回第一次递归!! swap(0,0)无效果,i自加得1第一层 第二次循环 i=1,k=0,m=3 初始为ABC 交换得:BAC 和前面类似的操作,输出 BAC,BCA后返回第一层,返回状态为BAC 交换得:ABC第一层 第三次循环 i=2,k=0,m=3 初始为ABC 交换得:CBA 和前面类似的操作,输出 CBA,CAB后返回第一层,返回状态为CBA 交换得:ABC六个结果就是依次:ABC,ACB,BAC,BCA,CBA,CAB
#include<stdio.h>#include<iostream.h>template <class Type>//函数模板inline void Swap(Type& a,Type& b){Type temp=a;a=b;b=temp;}template <class Type>void Perm(Type list,int k,int m){if(k==m){for(int i=0;i<=m;i++)cout<<list[i];cout<<endl;}elsefor(int i=k;i<=m;i++){Swap(list[i],list[k]);Perm(list,k+1,m);Swap(list[i],list[k]);}}int main(){int num;char list[502];cin>>num;cin>>list;Perm(list,0,num-1);cout<<endl;return 0;}
0 0
- 全排列递归算法
- 全排列递归算法
- 全排列算法-递归
- 全排列递归算法
- 全排列递归算法
- 全排列递归算法
- 全排列递归算法
- 全排列递归算法
- 全排列递归算法
- 全排列递归算法
- 全排列递归算法
- 递归算法---全排列
- 全排列递归算法
- 全排列递归算法
- 全排列递归算法
- 全排列递归算法
- 全排列递归算法
- 全排列递归算法
- JAVA WEB开发笔记
- Angular JS 跨域
- dlopen、dlsym和dlclose的使用和举例
- maven搭建ssm分模块框架+activeMQ (myeclipse版) (四)
- 强悍的命令行(三)
- 全排列递归算法
- 大话重构——改善代码
- 如何理解Gabor滤波器
- phpMyAdmin 错误:Error during session start
- 触发器解决外键约束问题
- Apache Flink fault tolerance源码剖析(二)
- Linux Mint 17 fcitx输入法配置
- [Java]ITOO初步了解
- perl EXPORT模块