全排列
问题描述:设有{r1,r2,…,rn}共n个元素,这n个元素中可能存在重复元素,试设计一个算法,列出这n个元素的不同排列。
#include<stdio.h>
#include<stdlib.h>
int *arr,n,count;
void swap(int i,int j)
{
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
void print()
{
int m;
count++;
for(m=0;m<n;m++)
printf("%d\t",arr[m]);
putchar('\n');
}
void perm(int start,int end){
if(start==end)
print();
else{
for(int i=start;i<=end;i++)
if(start==i||(start!=i&&arr[start]!=arr[i])){//剔除重复项
swap(start,i);
perm(start+1,end);
swap(start,i);
}
}
}
int main(){
int i,j;
scanf("%d",&n);
arr=(int*)malloc(sizeof(int)*n);
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
//小→大,可以轻易剔除重复排列
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(arr[i]>arr[j])
swap(i,j);
perm(0,n-1);
printf("%d\n",count);
}