全排列就是求排列组合里的A(m,n),(n>=m)的全部情况。我们要统计A(m,n)很简单用阶乘就可以求,但是要输出全部情况就有些困难了。这里我介绍记下用递归求解全排列全部情况的方法。
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 5 int n; 6 int p[100]; 7 bool vis[100]; 8 9 void generage(int index,int &cnt){ 10 if(index == n+1){ 11 cnt++; 12 for(int i=1;i<=n;i++){ 13 cout<<p[i]<<" "; 14 } 15 cout<<endl; 16 return; 17 } 18 for(int i=1;i<=n;i++){ 19 if(!vis[i]){ 20 p[index] = i; 21 vis[i] = true; 22 generage(index+1,cnt); 23 vis[i] = false; 24 } 25 } 26 } 27 28 int main(){ 29 cin>>n; 30 int cnt=0; 31 generage(1,cnt); 32 cout<<"共计"<<cnt<<"种情况" ; 33 return 0; 34 }
大概的思路如下:
以A(3,3)为例,我们可知最终情况有P(1,2,3)、P(1,3,2)、P(2,1,3)、P(2,3,1)、P(3,1,2)、P(3,2,1)这六种情况。从P[ ]中我们可以发现能分为三层,递归函数的参数index就是层的索引号,再每一层我们都尝试填入未使用过的数字,之后进入下一层继续反复如此步骤,直至P[ ]数组被填满,最后输出一种情况,之后回溯到上一层继续填入未使用过的数字,在进入下一层递归。如此反复最终输出全部情况。以上所述也就是递归的分治思想。
这个算法也是一个全排列的基本模板,稍加修改可以用于解决n皇后问题。