package 习题;
public class 搭积木 {
static int a[]=new int[10];
static boolean num[]=new boolean[10];
static int count=0;
public static void main(String[] args) {
for(int i=0;i<10;i++) {
num[i]=true;
}
backtrack(0);
System.out.println(count);
}
public static void backtrack(int n) {
if(n>1 && !isOk(n-1)) { //不满足就结束,
return;
}
if( n==10 && isOk(n-1)){ //满足+1
count++;
return;
}
for(int i=0;i<10;i++) { //回溯法
if(num[i]==true) {
a[n]=i;
num[i]=false;
backtrack(n+1);
num[i]=true;
}
}
}
public static boolean isOk(int n) { //判断是否符合要求
boolean flag = false;
switch(n){
case 1:flag=(a[0]<a[1]);break;
case 2:flag=(a[0]<a[2]);break;
case 3:flag=(a[1]<a[3]);break;
case 4:flag=(a[1]<a[4]&&a[2]<a[4]);break;
case 5:flag=(a[2]<a[5]);break;
case 6:flag=(a[3]<a[6]);break;
case 7:flag=(a[3]<a[7]&&a[4]<a[7]);break;
case 8:flag=(a[4]<a[8]&&a[5]<a[8]);break;
case 9:flag=(a[5]<a[9]);break;
}
return flag;
}
}