/*
指数型枚举(每个数有选和不选两种情况)
#include<bits/stdc++.h>
using namespace std;
const int N=20;
int n;
int st[N];//记录每个数的状态,0还没有考虑,1表示选这个数,2表示不选这个数
void dfs(int x){//x表示枚举到了哪个位置
if(x>n){
for(int i=1;i<=n;i++){
if(st[i]==1){
printf("%d ",i);
}
}
printf("\n");
return ;
}
//不选
st[x]=2;
dfs(x+1);
st[x]=0;//回溯因为从一个点到他的一个分支可以视为下一个点选
//或不选,你要到另一个分支去你就要先回到初始状态
//选
st[x]=1;
dfs(x+1);
st[x]=0;
}
int main(){
scanf("%d",&n);
dfs(1);
return 0;
}*/
/*
全排列
#include<bits/stdc++.h>
using namespace std;
const int N=10;
int n;
bool st[N];//用来表示选没选
int arr[N];//用来存答案
void dfs(int x){
if(x>n){
for(int i=1;i<=n;i++){
printf("%5d",arr[i]);//五个场宽
}
printf("\n");
return ;
}
for(int i=1;i<=n;i++){
if(!st[i]){
st[i]=true;
arr[x]=i;
dfs(x+1);
st[i]=false;
arr[x]=0;
}
}
}
int main(){
scanf("%d",&n);
dfs(1);
return 0;
}*/
/*
组合123 124
后面比前面大
*/
#include<bits/stdc++.h>
using namespace std;
const int N=21;
int n,r;
int arr[N];
void dfs(int x,int start){
if(x>r){
for(int i=1;i<=r;i++){
printf("%3d",arr[i]);
}
printf("\n");
return;
}
for(int i=start;i<=n;i++){
arr[x]=i;//比如说你有多个分支那就会进入很多这个for循环所以要传i而不是start
dfs(x+1,i+1);
arr[x]=0;
}
}
int main(){
scanf("%d %d",&n,&r);
dfs(1,1);
return 0;
}