题目描述: 排列与组合是常用的数学方法。先给一个正整数 ( 1 < = n < = 10 ) 例如n=3,所有组合,并且按字典序输出:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
分析:今天看书看到了递归入门,做到了这一道题目,记录一下。在C++的库函数中,提供了函数next_permutation(),来获得一个数组的各种组合,这个题目的第一种解法就是使用这个函数就可以很简单的完成。除此之外,这里中这道题目进行了简单的递归练习,就是用深度遍历算法来求出所有的排列组合。递归的做法是借助深度遍历算法,递归的边界是已经选择了n个数。
//way 1: #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <vector> using namespace std; int a[15] ; int main() { for(int i=0;i<15;i++) { a[i]=i+1; } int n; scanf("%d",&n); do { for(int i=0;i<n;i++) { if(i>0){ printf(" "); } printf("%d",a[i]); } printf("\n"); }while(next_permutation(a,a+n)); return 0; }
//DFS递归实现 #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <vector> using namespace std; vector<int> ans; int a[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; int flag[15]={0}; int n; void DFS(int num) { if(num==n)//已经选择了n个数则输出 { for(int i=0;i<n;i++) { if(i>0) { printf(" "); } printf("%d",ans[i]); } printf("\n"); return ; } for(int i=0;i<n;i++) { if(flag[i]==0) { ans.push_back(a[i]); flag[i]=1; DFS(num+1);
//退出递归后记得将刚刚插入的数弹出 flag[i]=0; ans.pop_back(); } } } int main() { scanf("%d",&n); DFS(0); return 0; }