全排列问题sdut
Description
从n个不同元素任取m(m<=n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列,当m=n时所有的排列情况叫全排列。现输入n个递增的数,请你输出这n个数的全排列。全排列输出顺序如样例所示。
Input
多组输入。
首先输入一个数据组数T(1<=T<=100)
接下来是T组数据。
每组数据有两行。
第一行先输入一个整数n(1<=n<=10)。
接下来是一行输入n个由空格分开的互不相同的整数num(1<=num<=90000)。
Output
对于每组数据,每一种排列占一行,各元素间用逗号隔开。
Sample
Input
1 3 1 2 3
Output
1,2,3 1,3,2 2,1,3 2,3,1 3,2,1 3,1,2
最重要的就是找到两个东西:1.结束条件 2。递归条件,简单来说就是前一个与后一个的关系。
1 #include<stdio.h> 2 3 int a[100000];//开数组来存放数字 4 void f(int a[],int l, int n)//l指向需要交换的左边第一个元素,n指向右边需要交换的第一个元素的地址 5 { 6 int i; 7 if(l==n)//返回条件,终止条件,如果只剩下一个元素还需要交换 8 { 9 for(i=1;i<=n;i++) 10 { 11 if(i==n) 12 printf("%d\n",a[i]); 13 else 14 printf("%d,",a[i]); 15 } 16 } 17 else//如果还有好几个元素 18 { 19 for(i=l;i<=n;i++) 20 { 21 ch(&a[i],&a[l]);//将当前组的第一个与后面的每一个进行交换 22 f(a,l+1,n);//递归调用,将后面r-i-1个依次交换排序 23 ch(&a[i],&a[l]); 24 } 25 } 26 } 27 void ch(int *p, int *q)//交换函数 28 { 29 int t; 30 t = *q; 31 *q = *p; 32 *p = t; 33 } 34 int main() 35 { 36 int t; 37 scanf("%d",&t); 38 while(t--) 39 { 40 int n; 41 scanf("%d",&n); 42 int i; 43 for(i=1; i<=n; i++) 44 scanf("%d",&a[i]); 45 f(a,1,n); 46 } 47 return 0; 48 }

浙公网安备 33010602011771号