#include<stdio.h>
void Swap(int *a,int x,int y) { //交换函数
int t=a[x];
a[x]=a[y];
a[y]=t;
}
void Perm(int *a,int m,int n) { //全排列函数
if(m==n) {
for(int i=0;i<n;i++) printf("%d ",a[i]);
printf("\n");
}
else for(int i=m;i<n;i++){ //n次嵌套循环,交换值实现所有可能的情况
Swap(a,m,i);
Perm(a,m+1,n); //递归
Swap(a,m,i);
}
}
int main() {
int a[10];
int n = 5;
for(int i=0;i<n;i++) a[i]=i+1;
Perm(a,0,n);
}
思路,比如要求12345的全排列,那可以先求出以1开头,2345剩下四个数的全排列,以此类推,求出2开头,3开头的,最后求出所有的。这是一个递归求解子问题的思路,写法上,先把1放在首位,递归剩下的,然后把1和2交换位置构成的新数组b,那么b的首位就是2了,递归剩下的1345四个数即可。所以代码的15行就是一个交换,然后是16行一个递归,然后17行需要再次交换位置,把a数组变回原样,方便下次循环,递归别的情况,当m==n了也就是子问题已经不包含元素了,可以输出这个答案数组了。