#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> using namespace std; //全排列算法 求n的全排列以及排列个数 void perm(int a[],int begin,int end); void swap(int a[],int n,int m); int sum=0; int main() { int n; int a[1000]; cin>>n; for(int i=0;i<n;i++) { a[i]=i+1; } perm(a,0,n-1); cout<<sum<<endl; return 0; } //n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀); //出口:如果只有一个元素的全排列,则说明已经排完,则输出数组 //不断将每个元素放作第一个元素,然后将这个元素作为前缀,并将其余元素继续全排列,等到出口,出口 出去后还需要还原数组: void perm(int a[],int begin,int end) { if(begin==end) { for(int i=0;i<=end;i++) { cout<<a[i]<<" "; } cout<<endl; sum++; return ; } else { for(int i=begin;i<=end;i++) { swap(a,begin,i);//不断将每个元素放作第一个元素 perm(a,begin+1,end);//并将其余元素继续全排列 swap(a,i,begin);//再次交换,为下一次排列做准备 } } } void swap(int a[],int n,int m) { int temp; temp=a[n]; a[n]=a[m]; a[m]=temp; }
运行截图: