递归实现指数型枚举

从 1n1∼n 这 nn 个整数中随机选取任意多个,输出所有可能的选择方案。

输入格式

输入一个整数 nn

输出格式

每行输出一种方案。

同一行内的数必须升序排列,相邻两个数用恰好 11 个空格隔开。

对于没有选任何数的方案,输出空行。

本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。

数据范围

1n15

import java.util.*;

public class Main {
    public static void fbs(int n,int start,ArrayList<Integer> list){
        //输出及格式,一棵主干上所有结果
        if(list.size()>0){
            for(int i=0;i<list.size();i++){
                System.out.print(list.get(i)+(i==list.size()-1?"":" "));
            }
            System.out.println();
        }
        if(list.size()==0) System.out.println();//负责一种全不选的结果的输出

        for(int i=start;i<=n;i++){
            list.add(i);
            fbs(n,i+1,list);//决定一棵树的另一个主干
            list.remove(list.size()-1);//清理上一次的结果
        }
    }
    public static void main(String[] args){
       Scanner sc=new Scanner(System.in);
       int n=sc.nextInt();
       fbs(n,1,new ArrayList<>());
    }
}
//这道题可以从一棵树中梳理出思路

递归实现排列型枚举

把 1n1∼n 这 nn 个整数排成一行后随机打乱顺序,输出所有可能的次序。

输入格式

一个整数 nn

输出格式

按照从小到大的顺序输出所有方案,每行 11 个。

首先,同一行相邻两个数用一个空格隔开。

其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。

数据范围

1n9

import java.util.*;
public class Main{

    public static void bfs(int n,ArrayList<Integer> list,boolean[] vis){
        if(list.size()==n){
            for(int i=0;i<n;i++){
                System.out.print(list.get(i)+" ");
            }
            System.out.println();
        }

        for(int i=1;i<=n;i++){
            if(!vis[i]){
                vis[i]=true;
                list.add(i);
                bfs(n,list,vis);
                vis[i]=false;//状态恢复
                list.remove(list.size()-1);//返回上一层
            }
        }

    }
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        boolean[] vis=new boolean[n+1];
        bfs(n,new ArrayList<>(),vis);
    }
}
//这道题其实比上一种更加的易懂简单,主要思想都是一棵树,其中boolean数组用来保存状态,通过遍历来集数。

递归实现排列型枚举:

从 1n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案。

输入格式

两个整数 n,m在同一行用空格隔开。

输出格式

按照从小到大的顺序输出所有方案,每行 1 个。

首先,同一行内的数升序排列,相邻两个数用一个空格隔开。

其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如 1 3 5 7 排在 1 3 6 8 前面)。

数据范围

n>0
0mn
n+(nm)25

import java.util.*;
public class Main{
    public static void fbs(int n,int start,ArrayList<Integer> way,int m){
        if(way.size()==m){
            for(int i=0;i<way.size();i++){
                System.out.print(way.get(i)+" ");
            }
            System.out.println();
        }
        for(int i=start;i<=n;i++){
            way.add(i);
            fbs(n,i+1,way,m);
            way.remove(way.size()-1);
        }
    }
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int m=sc.nextInt();
        fbs(n,1,new ArrayList<>(),m);
    }
}
//这道题的思路和前面的很相似,都是一棵树的深度搜索,这道题本质上是组合,并且从小到大枚举

 

posted on 2025-02-24 11:52  fafrkvit  阅读(22)  评论(1)    收藏  举报