问题描述:
输入N,在1~N之间,以不同方案取数
输出格式:
每行输出一种方案。
同一行内的数必须升序排列,相邻两个数用恰好 11 个空格隔开。
对于没有选任何数的方案,输出空行。
本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。
问题分析:
具体代码:
package easy;
import java.util.Scanner;
public class Number_n {
public static boolean[] a = new boolean[20]; //定义全局数组
public static int N;
public static void dfs(int n){
if(n > N){
for(int i = 1;i <= n;i++)
if(a[i] == true)
System.out.print(i + " ");
System.out.println();
return; //到这里说明输出完毕了,必须“return”,退出此方法
}
a[n] = true;
dfs(n+1); //选了这个数
a[n] = false; //不选,所以要把标记标为false
dfs(n+1); //不选这个数
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
N = input.nextInt();
dfs(1);
}
}
注意:
1、Java中定义全部变量/数组:在class内,一切方法外
eg:public static int[] a = new int[20]; //初始化数组要new,不要=null,不然后续会出错
public static int a;
2、在递归方法中,如果递归方法返回void,那么方法中实现完递归出口后,一定要记得return,否则代码会顺着执行下去
3、在递归中,要时刻记得恢复现场。如果不好理解,可以对应画出递归搜索树,想象着,在回溯时,要回到这个节点的父节点状态,再进行扩展。