在竞赛中,经常会有排列组合的问题,如果是全排列就会比较好实现,但是如果遇到了选数排列类型的题目就相当棘手,所以我这里提供两种题型的模板代码,用DFS实现选数排列与组合
1.在n个数中选k个数,进行排列
#include<cstdio>
int n,k;
int a[100];
int t[100];//记录已经选的数
bool vis[100];
void dfs(int step){
if(step==k){//k个数选完
for(int i=0;i<k;i++){
printf("%d",t[i]);
}
printf("\n");
return ;
}
for(int i=0;i<n;i++){
if(!vis[i]){
vis[i]=true;
t[step]=a[i];
dfs(step+1);
vis[i]=false;
t[step]=0;//回溯
}
}
}
int main(){
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
dfs(0);
return 0;
}
2.在n个数中选k个数,进行组合
遵循“搜索不降原则”
#include<cstdio>
int n,k;
int a[100];
int t[100];
void dfs(int step,int stratx){//startx防止重复选择
if(step==k){
for(int i=0;i<k;i++){
printf("%d ",t[i]);
}printf("\n");
return;
}
for(int i=stratx;i<n;i++){
t[step]=a[i];//对选的数进行回溯
dfs(step+1,i+1);
}
return;//一轮选完后进行回溯;
}
int main(){
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
dfs(0,0);
return 0;
}