第一题
import java.util.Scanner;
public class Main1 {
int [] arr = new int [10];
int [] book = new int [10];
int n;
public static void main(String[] args) {
Main1 dd = new Main1();
Scanner sc = new Scanner(System.in);
dd.n = sc.nextInt();
for(int i =0;i<10;i++){
dd.book[i]=0;
}
dd.dfs(1);
}
public void dfs(int step){
if(step==n+1){
for(int i =1;i<=n;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
return;
}
for(int i =1;i<=n;i++){
if(book[i] == 0){
arr[step] = i; // 把第i张牌放在第step桶里
book[i] = 1; // 把该张牌(i)标记为1;说明该张牌已经不掌握;
dfs(step+1); // 执行下一步
// System.out.println(i);
book[i] = 0;
}
}
// return ;
}
}
思路:book[i]==0,表示数字为i的牌可以用,如果可用,就把i赋给arr[step],然后针对i++接着递归往后进行,并且step++,当step==4,就把arr[]数组里的n个数输出,然后开始从末尾回溯,依次把符合条件的i加入arr[step]数组。
第二题
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
static int []arr= {1,2,3,4,5,6,7,8,9,10};
static int count_num=0;
public static void DFS(int i,boolean root[],int x[]) {
if(i>=10) {
count_num++;
return;
}
else {
for(int j=0;j<10;j++) { //用来确定那张牌可用的基础
if(i==0||(Math.abs(arr[j]-x[i-1])!=1&&!root[j])){//判断当前数字和前一个是否相邻
//为什么就是当前数和前一个呢?因为之前用过的数字root[i]是true,直接跳过if语句的所有代码,
//只有到了当前没用过的数字,才可以跟前一个数字比较。
x[i]=arr[j];//不相邻把当前数字赋给x[i],方便下一次判断
root[j]=true;//用过的话,标记一下,下一次不能用。
DFS(i+1,root,x);//
x[i]=0;//回溯过程中把x[i]的内容都修改为原始的。
root[j]=false;//从最后一个开始回溯
}
}
}
}
public static void main(String[] args) {
boolean []root=new boolean[10];
int []x=new int[10];
DFS(0,root,x);
System.out.print(count_num);
}
}