搭积木
小明最近喜欢搭数字积木,
一共有10块积木,每个积木上有一个数字,0~9。
搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。
下面是两种合格的搭法:
0
1 2
3 4 5
6 7 8 9
0
3 1
7 5 2
9 8 6 4
请你计算这样的搭法一共有多少种?
请填表示总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
思路:最简单思路,全排列暴力破解(个人见解),将0~9保存到数组,全排列数组, text(int[] array)方法判断,permute(int[] array,int start)方法进行递归全排列,打印出符合条件答案。
package Lqb;
import java.util.Arrays;
public class Text13 {
static int h=0;
public static void main(String[] args) {
int[] array={0,1,2,3,4,5,6,7,8,9};
permute(array,0);
}
//验证
public static int[] text(int[] array){
boolean a=array[0]<array[1]&&array[0]<array[2];
boolean b=array[1]<array[3]&&array[1]<array[4];
boolean c=array[2]<array[4]&&array[2]<array[5];
boolean d=array[3]<array[6]&&array[3]<array[7];
boolean e=array[4]<array[7]&&array[4]<array[8];
boolean f=array[5]<array[8]&&array[5]<array[9];
if(a&b&c&d&e&f){
return array;
}
return null;
}
//递归排列
public static void permute(int[] array,int start){
if(start==array.length-1&&text(array)!=null){
System.out.println(++h+" "+Arrays.toString(text(array)));
}
for(int i=start;i<array.length;i++){
swap(array,start,i);
permute(array,start+1);
swap(array,start,i);
}
}
//交换
public static void swap(int[] array,int start,int end){
int telp=array[start];
array[start]=array[end];
array[end]=telp;
}
}
答案:768 种