一、生成无重复元素的排列
#include <stdio.h>
void pailie(int n,int *A,int cur,int *p)//利用递归进行调用
{
int i,j;
if(cur==n)
{
for(i=0;i<n;i++)
{
printf("%d ",A[i]);
}
printf("\n");
}
else
for(i=0;i<n;i++)
{
int ok=1;
//判断一个数在数组中是否重复出现的方法
for(j=0;j<=cur;j++)
{
if(A[j]==p[i])//如果重复出现,令标记为0
ok=0;
}
if(ok)//如果没有重复出现,执行操作
{
A[cur]=p[i];//联想解答树,每一层的限制条件是p[i]在A[i]中没有出现重复。该层次已执行完毕,递归进行下一层次的选择
pailie(n,A,cur+1,p);
}
}
}
int main()
{
int p[3]={1,3,7} ;
int A[4];
pailie(3,A,0,p);
return 0;
}
二、生成有重复元素的排列
#include <stdio.h>
void pailie(int n,int *A,int cur,int *p)
{
int i,j;
if(cur==n)
{
for(i=0;i<n;i++)
{
printf("%d ",A[i]);
}
printf("\n");
}
else
for(i=0;i<n;i++)
{
int ok=1;
//判断一个数在数组中是否重复出现的方法
for(j=0;j<=cur;j++)
{
if(A[j]==p[i])//如果重复出现,令标记为0
{
ok=0;
break;
}
}
if(ok)//如果没有重复出现,执行的操作
{
A[cur]=p[i];
pailie(n,A,cur+1,p);
}
else//如果有重复出现的元素,执行的操作
{
if(!i||p[i]!=p[i-1])
{int c1=0,c2=0;
for(j=0;j<cur;j++)//计算A中p[i]出现的次数
{
if(A[j]==p[i]) c1++;
}
for(j=0;j<n;j++)//计算p中p[i]重复出现的次数
{
if(p[j]==p[i]) c2++;
}
if(c1<c2)
{
A[cur]=p[i];
pailie(n,A,cur+1,p);
}
}
}
}
}
int main()
{
int p[3]={1,1,2} ;
int A[4];
pailie(3,A,0,p);
return 0;
}