全排列的两种写法 2021-02-17

简介: 全排列的两种写法 2021-02-17

输出1、2、3、4、5五个数中任选三个数的全排列,其中不允许有重复的组合形式。

1. // C 写法
2. #include <iostream>
3. using namespace std;
4. int a[10],book[10],n;
5. void dfs(int step,int t){
6.  if(step==t+1){
7.    for(int i=1;i<=t;i++)
8.      cout<<a[i]<<" ";
9.    cout<<endl;
10.     return;
11.   }
12.   for(int i=1;i<=n;i++){
13.     if(book[i]==0&&i>a[step-1]){
14.       a[step]=i;
15.       book[i]=1;
16.       dfs(step+1,t);
17.       book[i]=0;
18.     }
19.   }
20.   return;
21. }
22. int main(int argc, char *argv[])
23. {
24.   n=5;
25.   dfs(1,3);
26.   return 0;
27. }
1. // C++ 写法
2. #include <iostream>
3. #include <vector>
4. #include <algorithm>
5. using namespace std;
6. vector<vector<int> > res;
7. void backtrack(vector<int> &nums,vector<int> &track)
8. {
9.  if(3==track.size())
10.   {
11.     res.push_back(track);
12.     return;
13.   }
14.   for(vector<int>::iterator it=nums.begin();it!=nums.end();it++)
15.   {
16.     if(std::count(track.begin(),track.end(),*it) || (track.size()>0 && *it<track.back()))
17.       continue;
18.     track.push_back(*it);
19.     backtrack(nums,track);
20.     track.pop_back();
21.   }
22. }
23. void dfs(vector<int> nums)
24. {
25.   vector<int> track;
26.   res.clear();
27.   backtrack(nums,track);
28. }
29. int main(int argc, char *argv[])
30. {
31.   int a[]={1,2,3,4,5};
32.   vector<int> nums(a,a+sizeof(a)/sizeof(a[0]));
33.   dfs(nums);
34.   for(int i=0;i<res.size();i++)
35.   {
36.     for(vector<int>::iterator it=res[i].begin();it!=res[i].end();it++)
37.       cout<<*it<<" ";
38.     cout<<endl;
39.   }
40.   cout<<res.size()<<endl;
41.   return 0;
42. }
相关文章
|
3月前
|
存储 算法 Java
|
6月前
并查集的不同写法
并查集的不同写法
38 2
斐波那契数列的几种写法 2021-02-23
斐波那契数列的几种写法 2021-02-23
|
机器学习/深度学习 算法
使用递归方法和for循环方法求阶乘
使用递归方法和for循环方法求阶乘
143 0
字符串的逆序(循环和递归两种解法)
字符串的逆序(循环和递归两种解法)
150 0
|
算法 C++
在 C/C++ 中反转字符串的不同方法
给定一个字符串,编写一个 C/C++ 程序来反转它。
135 0
算法学习--递归反转字符串
算法学习--递归反转字符串
|
存储
【C】逆序字符串(俩种递归思路)
【C】逆序字符串(俩种递归思路)
91 0
【C】逆序字符串(俩种递归思路)
复习C部分:1.for循环 2.do while循环语句 3.在一个有序数组中查找某个数,例如在1~10之间找7(例题包含计算n的阶乘+打印1~10的奇数+二分法)
复习C部分:1.for循环 2.do while循环语句 3.在一个有序数组中查找某个数,例如在1~10之间找7(例题包含计算n的阶乘+打印1~10的奇数+二分法)
113 0
复习C部分:1.for循环 2.do while循环语句 3.在一个有序数组中查找某个数,例如在1~10之间找7(例题包含计算n的阶乘+打印1~10的奇数+二分法)