HLG2179 组合(dfs水水更健康)

组合
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 57(38 users) Total Accepted: 43(36 users) Rating: Special Judge: No
Description

给出一个正整数N,从集合{1,2,3..N} 中找出所有大小为k的子集, 并按照字典序从小到大输出。

Input

第一行是一个整数T,代表T组测试数据。

接下来T行,每行是两个正整数n(1<=n<=10), k(1<=k<=n)。

Output

对于每组数据按字典序输出所有符合条件的子集。

Sample Input

1

5 3

Sample Output

1 2 3

1 2 4

1 2 5

1 3 4

1 3 5

1 4 5

2 3 4

2 3 5

2 4 5

3 4 5

Source
2014.11.29新生赛-热身赛
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int n,k;
int ans[50];
bool vis[50];
void dfs(int step,int p){
    if(step==k+1){
        for(int i=1;i<=step-1;i++){
           printf("%d%c",ans[i],i==step-1?'
':' ');
        }
        return ;
    }
    for(int i=p;i<=n;i++){
       if(!vis[i]){
          vis[i]=true;
          ans[step]=i;
          dfs(step+1,i+1);
          vis[i]=false;
       }
    }

}
int main(){
   int t;
   scanf("%d",&t);
   while(t--){
       memset(vis,false,sizeof(vis));
      scanf("%d%d",&n,&k);
      dfs(1,1);
   }

   return 0;
}
原文地址:https://www.cnblogs.com/13224ACMer/p/4774004.html