全排列问题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 }

 

posted @ 2020-06-06 23:05  爱写程序的机械师  阅读(159)  评论(0)    收藏  举报