#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=30;//way[u]其中u最大为30,u是代表第几个数
int n,m;//从n中选择m个数
int way[N];
void dfs(int u,int start)
{
//额外补充:剪纸操作,例如当 4 占据第一个位置的时候实际上已经可以不用进行操作了
//公式:1.已经使用了u-1个数 距离n也就是数的上限还差 n-start+1
// 2.u-1+n-start+1<m 的时候就应该进行剪枝操作了
if(u+n-start<m) return;
if(u-1==m)//u-1代表已经选取了u-1个数恰好等于m的时候,就可以返回结果了
{
for(int i=1;i<=m;i++)
{
cout<<way[i]<<" ";
}
cout<<endl;
}
//进行递归操作
for(int i=start;i<=n;i++)
{
way[u]=i;
dfs(u+1,i+1);//下一个要使用的u就是u+1;start从i+1开始
way[u]=0;
}
}
int main()
{
scanf("%d%d",&n,&m);
dfs(1,1);//第二个也就是start记录了开始的数字
return 0;
}
方法来自y总