//递归实现组合型枚举,从n个数中选出不重复的m个.
//按字典顺序输出,从小到大每次找三个
//可以用for循环,i 从 start开始, 每次深搜都修改搜索起始点
//数据量较大,用BufferedWriter输出
import java.io.*;
import java.util.*;
public class Main
{
static int n,m;
static int N = 26;
static int[] res = new int[N]; //用于存储其中一个结果
static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args)throws IOException
{
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
//第一个位置,从1开始深搜
dfs(1,1);
out.flush();
}
public static void dfs(int start,int u) throws IOException
{
//减枝(当可以枚举的个数小于m时,就没必要继续dfs)
//比如第二个数为5,第三个数已经没有数可以取了
if(u + n - start < m) return;
// 枚举完m位就可以开始打印,结束递归了
if(u == m + 1)
{
for(int i = 1;i <= m; i ++)
{
out.write(res[i] + " ");
}
out.write("\n");
return; //这个地方记得要退出递归
}
for(int i = start; i <= n; i++)
{
res[u] = i;
dfs(i + 1,u + 1);
res[u] = 0; //每次输出三个数,然后后面的值会对前面的覆盖,不写这行也行
// 1 -> 2 -> 3 然后就没法向下找了 然后把3改成4,改成5
//再把2改成3,改成4. 第二位为3,第三位可以4,5 第二位为4,第三位只能为3
//依次类推
}
}
}
AcWing.93.递归实现组合型枚举(Java版)
于 2023-12-02 10:34:22 首次发布