全排列,全组合(dfs)
Posted jrfr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全排列,全组合(dfs)相关的知识,希望对你有一定的参考价值。
全排列
#include <iostream> #include <cmath> #include <cstdio> #include <cstring> #include <string> #include <map> #include <iomanip> #include <algorithm> #include <queue> #include <stack> #include <set> #include <vector> //const int maxn = 1e5+5; #define ll long long #define MAX INT_MAX #define FOR(i,a,b) for( int i = a;i <= b;++i) using namespace std; bool b[50]; int v[50],cun[50]; int n,m; void dfs(int k) { if(k==m+1) { for(int i=1;i<=m;++i) { cout<<v[cun[i]]<<" "; if(i==m) { cout<<endl; } } } else { for(int i=1;i<=n;++i) { if(b[i]==1) { b[i]=0; cun[k]=i; dfs(k+1); b[i]=1; } } } } int main() { cin>>n>>m; for(int i=1;i<=n;++i) { cin>>v[i]; b[i]=1; } dfs(1); }
全组合
#include <iostream> #include <cmath> #include <cstdio> #include <cstring> #include <string> #include <map> #include <iomanip> #include <algorithm> #include <queue> #include <stack> #include <set> #include <vector> //const int maxn = 1e5+5; #define ll long long #define MAX INT_MAX #define FOR(i,a,b) for( int i = a;i <= b;++i) using namespace std; bool b[50]; int v[50],cun[50]; int n,m; void dfs(int k) { if(k==m+1) { for(int i=1;i<=m;++i) { cout<<v[cun[i]]<<" "; if(i==m) { cout<<endl; } } } else { for(int i=cun[k-1]+1;i<=n;++i) //唯一的不同 { if(b[i]==1) { b[i]=0; cun[k]=i; dfs(k+1); b[i]=1; } } } } int main() { cin>>n>>m; for(int i=1;i<=n;++i) { cin>>v[i]; b[i]=1; } dfs(1); }
以上是关于全排列,全组合(dfs)的主要内容,如果未能解决你的问题,请参考以下文章
[Mdfs] lc剑指 Offer 38. 字符串的排列(全排列+枚举顺序+组合类型枚举+知识理解+模板题)