从n个数[1~n]中取m个数进行排列组合,并以字典序输出所有可能结果,递归实现
具体代码如下
#include <iostream>
#include <vector>
using namespace std;
void combine(int n, int m, vector<int>a){
for(int i=1; i<=n; i++){
bool flag = true;
for(int j=a.size()-1; j>=m; j--){
if(a[j] == i){
flag = false;
break;
}
}
if(flag){
a[m-1] = i;
if(m>1){
combine(n, m-1, a);
}else{
for(int j=a.size()-1; j>=0; j--)
cout<<a[j]<<" ";
cout<<endl;
}
}
}
}
int main() {
int n,m;
cin>>n>>m;
vector<int> a(m);
combine(n, m, a);
}
方法二,速度较方法一更快
#include <iostream>
#include <string.h>
using namespace std;
int cnt,n,a[10],flag[10];
void dfs(int num){
if (num==cnt+1){
for(int i=1;i<num;i++){
printf("%d ",a[i]);
}
printf("\n");
return;
}
for(int i=1;i<=n;i++){
if(flag[i]==0){
flag[i]=1;
a[num]=i;
dfs(num+1);
flag[i]=0;
}
}
}
int main(){
cin>>n>>cnt;
dfs(1);
}