全排列递归算法
2016-05-29 21:12
309 查看
我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{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; } else for(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; }
我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- C语言实现选择排序、冒泡排序和快速排序的代码示例
- 探讨C语言的那些小秘密之断言