链接:P1157 组合的输出 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目描述:
代码:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int r = sc.nextInt();
Solution s = new Solution(n, r);
s.dfs(0); //从0开始
}
}
class Solution {
int n;
int r;
int[] res; //存放结果
//构造器 , 初始化
public Solution(int n, int r) {
this.n = n;
this.r = r;
res = new int[r];
}
//打印
public void prt() {
for (int i : res) {
System.out.printf("%3d", i);
}
System.out.println();
}
//给res下标为k的位置排一个数字
//排好后, 递归调用dfs(k+1), 给下标为 k+1 的位置排一个数字
public void dfs(int k) {
//当 k==r 时,说明组合出了一个结果 并打印
if (k == r) {
prt();
} else {
//第0步,给res下标为0的位置 找(排)一个数字
if (k == 0) {
for (int i = 1; i <= n - r + 1; i++) {
res[0] = i;
dfs(1);
}
} else {
//后面的位置在排列数字时,要求比上一个所选的数字大
for (int j = res[k-1] + 1; j <= n; j++) {
res[k] = j;
dfs(k + 1);
}
}
}
}
}