思路:
可以通过递归的方法把n的全排列问题转化为n-1的全排列问题,逐渐推导到一个数字的全排列,显然一个数字的全排列方式只有一种,下面就展示实现该过程的实现代码:
#include <iostream>
using namespace std;
void swap(int &a,int &b){
int temp=a;
a=b;
b=temp;
}
void pai_xu(int a[],int m,int n){
if(m==n){
for(int i=1;i<=n;i++){
cout<<a[i];
}
cout<<endl;
}
else{
for(int i=m;i<=n;i++){
swap(a[i],a[m]);
pai_xu(a,m+1,n);
swap(a[i],a[m]);
}
}
}
int main(){
int n,m=1,a[10];
cin>>n;
for(int i=1;i<=n;i++){
a[i]=i;
}
pai_xu(a,m,n);
return 0;
}
下面对代码进行解释:
for(int i=m;i<=n;i++){
swap(a[i],a[m]);
pai_xu(a,m+1,n);
swap(a[i],a[m]);
}
在这一部分代码是整个程序的核心部分,很多人都是对这里有疑问,在这部分中可以这样理解,m代表着数列的开头,a[i]和a[m]交换既是由a[i]所对应的数字打头阵,由于有for循环的存在,显然1-n都会有机会打头阵,接下来的递归调用就是把n的全排列问题转化为n-1的全排列问题,然后逐步推导,一直到m=n时可以输出第一个排列,这时候程序就会执行上面语句段的第二个交换语句,这个语句的作用是要把原来交换了的排列恢复,让前面的语句再换一个数字打头阵接着又反复进行。
注意:把m理解为数列的开头,上面那句和a[m]交换,理解为把哪个数字换到开头位置,后面的交换理解为换开头数字前恢复排列的作用。