从n个不同元素任取m(m<=n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列,当m=n时所有的排列情况叫全排列。现输入n个递增的数,请你输出这n个数的全排列。全排列输出顺序如样例所示。
###输入格式:
第一行先输入一个整数n(1<=n<=10)。
接下来是一行输入n个由空格分开的互不相同的整数num (1 <= num <= 90000)。
###输出格式:
对于每组数据,每一种排列占一行,各元素间用逗号隔开。
###输入样例:
3
1 2 3
###输出样例:
1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
#include<stdio.h>
int n;
int a[11];
void swap(int p,int q){
int t;
t=a[q];
//循环每个元素后移
for(int i=q;i>=p+1;i--){
a[i]=a[i-1];
}
a[p]=t;
}
// 4 1 2 3
//1 2 3 4
void swapback(int p,int q){
int t=a[p];
for(int i=p;i<=q-1;i++){
a[i]=a[i+1];
}
a[q]=t;
}
void perm(int p,int q){
int i;
if(p==q){
for(i=0;i<=q;i++){
if(i==q) printf("%d\n",a[i]);
else printf("%d,",a[i]);
}
}
else {
for(i=p;i<=q;i++){
swap(p,i);
perm(p+1,q);
swapback(p,i);
}
}
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
perm(0,n-1);
return 0;
}
第一个swap函数
作用是将每一个元素都作为开头
这样就有了
1开头的全排列
123
132
2开头的全排列
213
231
3开头的全排列
312
321
p是数列的边界,q是数列的右边界
将p也就是第一个位置 与后面的所有位置的进行交换
第二个函数也就是递归函数
排列123
排完1之后 我们只需要在排列23 32即可 这也就是递归的调用
同理如果是多个数据的话
12345
只需要排列1 后排列 2345 排2的时候 在去排列345 再排列45
但是如果是这样的话
模拟运行一下
123
然后是132
当再进行交换的时候
是此时处于第二个位置的3与1进行交换
所以是3开头 便不是想要的2开头的了
所以需要再进行换回来
可是如果只是简单的换回来
同时每次
eg:
1234
4123是我们想要的 而不是4231
所以每次交换是后面的整体后移
同理换回来的时候
4123
1234
将首位保存后依次前移