版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40205116/article/details/88353962
搭积木
小明最近喜欢搭数字积木,
一共有10块积木,每个积木上有一个数字,0~9。
搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。
下面是两种合格的搭法:
0
1 2
3 4 5
6 7 8 9
0
3 1
7 5 2
9 8 6 4
请你计算这样的搭法一共有多少种?
请填表示总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
最后结果为:768
public class Main {
static int sum = 0;
public static void main(String[] args) {
int a[] = new int[10];
boolean v[] = new boolean[10];
dfs(a, v, 0);
System.out.println(sum);
}
private static void dfs(int[] a, boolean[] v, int n) {
if(n == 10) {
if(fun(a)) {
sum++;
}
return ;
}
for(a[n] = 0; a[n] < 10; a[n]++) {
if(v[a[n]] == false) {
v[a[n]] = true;
n = n+1;
dfs(a, v, n);
n = n - 1; //回溯
v[a[n]] = false;
}else {
continue;
}
}
}
private static boolean fun(int[] a) {
if(a[0] < a[1] && a[0] < a[2] && a[1] < a[3] && a[1] < a[4]
&& a[2] < a[4] && a[2] < a[5] && a[3] < a[6] && a[3] < a[7]
&& a[4] < a[7] && a[4] < a[8] && a[5] < a[8] && a[5] < a[9]) {
return true;
}
return false;
}
}