
import java.util.*;
import java.io.*;
class Main {
static int n,m;
static int [] arr;
static StringBuilder sb = new StringBuilder();
public static void main (String[] args) throws java.lang.Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
arr = new int[m];
dfs(0,0);
System.out.print(sb);
}
static void dfs(int d,int start){
if(d==m){
for(int i=0;i<arr.length;i++){
sb.append(arr[i]+" ");
}
sb.append("\n");
return;
}
for(int i=start;i<n;i++){
arr[d]= i+1;
dfs(d+1,i+1);
}
}
}

아래는 내가 처음에 boolean 사용한 코드, check 코드 빼도 됨.
import java.io.*;
import java.util.*;
public class Main{
static StringBuilder sb = new StringBuilder();
static int n,m;
static int [] arr;
static boolean [][] check;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
check = new boolean[n][n];
arr = new int[m];
dfs(0,0);
System.out.print(sb);
}
public static void dfs(int d,int start){
if(d==m){
for(int i=0;i<arr.length;i++){
sb.append(arr[i]+" ");
}
sb.append("\n");
return;
}
for(int i=start;i<n;i++){
if(!check[i][start]&&!check[start][i]){
check[i][start]= true;
check[start][i] = true;
arr[d] = i+1;
dfs(d+1,i+1);
check[i][start]= false;
check[start][i] = false;
}
}
}
}
