全排列的两种写法 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. }
相关文章
代码随想录Day9 栈与队列 LeetCodeT20 有效的括号 T1047 删除字符串中所有相邻重复项 T150 逆波兰表达式求值
代码随想录Day9 栈与队列 LeetCodeT20 有效的括号 T1047 删除字符串中所有相邻重复项 T150 逆波兰表达式求值
33 0
|
2月前
数组去重for循环和for循环嵌套
数组去重for循环和for循环嵌套
30 0
|
7月前
并查集的不同写法
并查集的不同写法
42 2
|
7月前
|
Java C++ Python
acwing 3302. 表达式求值
acwing 3302. 表达式求值
斐波那契数列的几种写法 2021-02-23
斐波那契数列的几种写法 2021-02-23
|
机器学习/深度学习 算法
使用递归方法和for循环方法求阶乘
使用递归方法和for循环方法求阶乘
148 0
|
C语言 容器
【C语言】为什么推荐把for循环写成左闭右开区间
循环十次打印"hello world",判定条件通常有两种写法:左闭右开区间、左闭右闭区间
|
算法
LeetCode每日1题--逆波兰表达式求值
LeetCode每日1题--逆波兰表达式求值
95 0
|
C语言
C语言 输出三角形数列 for循环
C语言 输出三角形数列 for循环
|
编译器
代码随想录刷题|LeetCode 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值(上)
代码随想录刷题|LeetCode 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值