1:递归实现,代码来自刘汝佳大神的书<<算法竞赛入门经典>>
/* n为集合种元素个数,p数组存放要生成全排列的数组,A数组存放每种排列
cur表示当前需要确定A数组的第几个元素
注意对于可重集,我们需要 不重不漏 地枚举遍目标集合种所有元素
代码实现( if(!i || p[i]!=p[i-1]) )
即检查目标集合中第一个元素和所有"与前一个元素不同"的元素
还需注意在调用函数之前一定要对目标数组排序
*/
void print_permutation(int n,int *p,int *A,int cur){
int i,j;
if( cur==n )
{
for( i=0;i<n;i++ ) printf("%d ",A[i]);
printf("\n");
}
else
{
int c1,c2;
for( i=0;i<n;i++ )
{
if( !i || p[i]!=p[i-1] )
{
c1=0,c2=0;
for( j=0;j<cur;j++ ) if( p[i]==A[j] ) c1++;
for( j=0;j<n;j++ ) if( p[i]==p[j] ) c2++;
if( c1<c2 )
{
A[cur]=p[i];
print_permutation(n,p,A,cur+1);
}
}
}
}
}
2:回溯法实现
void dfs(int dep){
int i;
if( dep>=n ){
for( i=0;i<n;i++ )
cout<<x[i]<<" ";
cout<<endl;
return;
}
int last=-1; //保证每层解答树不重不漏地枚举所有的未被访问过的a[i]值
for( i=0;i<n;i++ ){
if( !vis[i] && a[i]!=last ){
x[dep]=a[i];
vis[i] = 1;
last=a[i];
dfs(dep+1);
vis[i] = 0;
}
}
}
3:导入算法库后调用next_permutation(iterator start,iterator end),具体用法大家可以参考其他博客,在这里就不多说了.