集合的全排列问题

全排列问题的递归算法(回溯算法)

 1 //产生元素k~m的全排列,作为前k-1个元素的后缀
 2 void Perm(int list[],int k,int m)
 3 {
 4     //构成了一次全排列,输出结果
 5     if(k==m)
 6     {
 7         for(int i=0; i<=m; i++)
 8             cout<<list[i]<<" ";
 9         cout<<endl;
10     }
11     else
12         //在数组list中,产生元素k~m的全排列
13         for(int j=k; j<=m; j++)
14         {
15             swap(list[k],list[j]);   //swap()是标准库函数,交换两个元素的值。
16             Perm(list,k+1,m);
17             swap(list[k],list[j]);
18         }
19 }

列如:数组 list [] ={1,2,3,4,5,6},则调用Perm(list,0,3)就是产生元素1~4的全排列。

一般情况下,k<m。该算法将list[k:m]中的每一个元素分别与list[k]中的元素交换,然后递归地计算元素list[k+1:m]的全排列,并将计算结果作为list[0:k]的后缀。

原文地址:https://www.cnblogs.com/pshw/p/4838836.html