排列问题
- 设R={R1,R2,R3……..Rn},是要进行排列的n个元素,Ri = R-{ri}。
- 集合X中元素的全排列记为Perm(X)。
- (ri)Perm(X)表示在全排列Perm(X)的每一个排列前加上前缀ri得到的排列。
R的全排列规律为:
- 当n=1时,Perm(R)=(r),其中r是集合R中唯一的元素。
- 当n>1时,Perm(R)由 (r1)Perm(R1), (r2)Perm(R2), ……..,(rn)Perm(Rn)构成。
设计递归算法:
下面程序调用函数perm(list,0,n-1),则产生list[0:n-1]的全排列
#include<iostream>
using namespace std;
#define MAX 100
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
void perm(int 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[k],list[i]);
perm(list,k+1,m);
swap(list[k],list[i]);
}
}
int main()
{
int n,list[MAX];
cin>>n;
for(int i=0;i<n;i++)
cin>>list[i];
perm(list,0,n-1);
return 0;
}