全排列

全排列就是求排列组合里的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 }
View Code

大概的思路如下:

以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皇后问题。

posted @ 2018-03-10 14:05  javier_macro  阅读(269)  评论(0)    收藏  举报