HLG2179 组合(dfs水水更健康)
组合 | ||||||
|
||||||
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?'\n':' '); } 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; }