标签:else 全排列 amp int iostream using clu 前缀 style
全排列的实现-- 递归
中心思想:
设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}.
Perm(X)表示在全排列Perm(X)的每一个排列前加上前缀ri得到的排列。
(1)当n=1时,Perm(R)=(r),其中r是集合R中唯一的元素;
(2)当n>1时,Perm(R)可由(r1)+Perm(R1),(r2)+Perm(R2),…,(rn)+Perm(Rn)构成。
那么具体程序要怎么实现呢?我们来个实际的例子,假设有一数列1,2,3,4
那么1,2,3,4的全排列
perm({1,2,3,4})=1perm({2,3,4})+2perm({1,3,4})+3perm({1,2,4})+4perm(1,2,3)
那么我们只要将每个数,与第一个数交换不就可以得到下一个序列了。
比如{1,2,3,4}第一个与第二个数交换,那么不就得到2 {1,3,4}了。
// 输出n个整数的全排列 #include<iostream> using namespace std; void swap(int & a, int & b){ int tmp; tmp = a; a = b; b = tmp; } void perm(int list[], int low, int high) { if (low == high) //当low == high时,此时list就是其中一个排列,所以输出 { for (int i = 0; i <= high; i++){ cout << list[i]; } cout << endl; } else { for (int i = low; i <= high; i++) // i 从 low 变化到 high,每个元素与第一个元素交换 { swap(list[low], list[i]); perm(list, low + 1, high); // 交换后,得到子序列,用函数perm得到子序列的全排列 swap(list[low], list[i]); // z最后将元素交换回来,复原,然后为下一步交换另一个元素做准备 } } } int main(){ int list[10] = {0,1,2,3,4,5,6,7,8,9}; perm(list, 0, 2); return 0; }
标签:else 全排列 amp int iostream using clu 前缀 style
原文地址:http://www.cnblogs.com/simplepaul/p/7639065.html