一.全排列代码A(n,r)或者A(n,n)
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
int n,r,cn,bo[MAX],a[MAX],num[MAX];
void search(int k)
{
int i;
//if(k==n)
if(k==r)
{
cn++;
//for(i=0;i<n;i++)
for(i=0;i<r;i++)
printf("%d ",a[i]);
printf("\n");
return ;
}
for(i=0;i<n;i++) //全排列公式,对于每一个i来说,可以取任何一个数
{
if(!bo[i])
{
bo[i]=1;
a[k]=num[i];
search(k+1);
bo[i]=0;
}
}
}
int main()
{
int i;
while(scanf("%d %d",&n,&r)!=EOF)
{
for(i=0;i<n;i++)
num[i]=i+1;
cn=0;
search(0);
printf("cn=%d\n",cn);
}
return 0;
}
运行结果
二.组合代码(组合其实是有序的全排列,加上有序控制即可) C(n,r)
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
int bo[MAX],num[MAX],n,r,a[MAX],cn;
void search(int k)
{
int i;
if(k==r)
{
//output
cn++;
for(i=0;i<r;i++)
printf("%d ",a[i]);
printf("\n");
}
else
{
for(i=0;i<n;i++)
{
if(!bo[i]&&((k==0)||(k>0&&num[i]>a[k-1]))) //第一个数可以随便选,为了防止重复,后面的数只能选大于前面的数(有序选)
{
bo[i]=1;
a[k]=num[i];
search(k+1);
bo[i]=0; //回溯前清理
}
}
}
}
int main()
{
int i;
scanf("%d",&n);
for(i=0;i<n;i++)
num[i]=i;
while(scanf("%d",&r)!=EOF)
{
for(i=0;i<n;i++)
bo[i]=0;
cn=0;
search(0);
printf("cn=%d\n",cn);
}
return 0;
}
运行结果