**
搭积木规则:
**
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。
下面是两种合格的搭法:
0
1 2
3 4 5
6 7 8 9
0
3 1
7 5 2
9 8 6 4
请你计算这样的搭法一共有多少种?
请填表示总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
*问题分析:
这道题目有两种方法,第一种是最好理解的破例破解,直接for循环遍历每一个位置加上判断即可,第二种方法是使用递归方法,直接上代码吧。
package Ming.Li;
public class C7 {
static boolean[] k = new boolean[10]; //判断数字是否已取到,0 - 9 分别对应数字0 - 9是否已取到
static int arr[] = new int[10]; //用来存放数字,索引0 - 9对应金字塔从上到下,从左到右的位置
static int count = 0;
public static void main(String[] args) {
ff(1); //因为0始终在最上层,所以从1位置处开始遍历
System.out.println(count);
}
public static void ff(int m){
if(m == 10){
if(check()) count++;
}
//m为1 - 9遍历位置,m为10判断是否满足
else{
for(int i = 1;i<= 9;i++){
if(k[i] == false){
k[i] = true;
arr[m] = i;
ff(m+1); //递归遍历每一个位置
k[i] = false;
}
}
}
}
// 检查是否满足
public static boolean check(){
//检查是否满足规则
if(arr[1]<arr[3] && arr[1]<arr[4] && arr[2]<arr[4] && arr[2]<arr[5] &&
arr[3]<arr[6] && arr[3]<arr[7] && arr[4]<arr[7] && arr[4]<arr[8] &&
arr[5]<arr[8] && arr[5]<arr[9]){
return true;
}
else return false;
}
}
运行结果是 768