码迷,mamicode.com
首页 > 其他好文 > 详细

全排列

时间:2018-03-10 16:03:08      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:play   dex   sed   递归   技术   one   space   log   ret   

全排列就是求排列组合里的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皇后问题。

全排列

标签:play   dex   sed   递归   技术   one   space   log   ret   

原文地址:https://www.cnblogs.com/javier2018/p/8539013.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!