注解
1、题意很简单,从N个升序的数中选6个出来,问总共有多少种方案,并按字典序输出。
2、典型的DFS,DFS的写法是递归,满足条件就是找到了6个数(定义一个b数组存放选中的数)。否则的话,就设置一个vis数组,看该数是否访问过。如果没访问过,就先访问,然后把该数加到b数组里。继续DFS找下一个数。DFS结束后,该数的访问标记恢复为0,方便下一次的访问。
代码
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 13;
int k;
int a[maxn];
int b[maxn];
int vis[maxn];
void dfs(int pos, int num){
if(num==6){
cout<<b[0];
for(int i=1; i<6; i++){
cout<<" "<<b[i];
}
cout<<endl;
return;
}
for(int i=pos; i<k; i++){
if(!vis[i]){
vis[i] = 1;
b[num] = a[i];
dfs(i+1, num+1);
vis[i] = 0;
}
}
}
int main() {
cin>>k;
int first = 1;
while(k){
if(first){
first = 0;
}
else{
cout<<endl;
}
for(int i=0; i<k; i++){
cin>>a[i];
}
memset(vis, 0, sizeof(vis));
dfs(0, 0);
cin>>k;
}
return 0;
}