小明最近喜欢搭数字积木,
一共有10块积木,每个积木上有一个数字,0~9。
搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。
下面是两种合格的搭法:
0
1 2
3 4 5
6 7 8 9
0
3 1
7 5 2
9 8 6 4
请你计算这样的搭法一共有多少种?
static int num = 0;
public static void main(String[] args) {
String str[] = {"1","2", "3", "4", "5", "6", "7", "8","9" };
permutation(str, 0, str.length);
System.out.println(num);
}
static void swap(String[] str, int start, int end) {
String tmep = str[start];
str[start] = str[end];
str[end] = tmep;
}
static void permutation(String[] str, int start, int end) {
if (start == end - 1) {
int a[][];
a = new int[4][];
a[0] = new int[1];
a[1] = new int[2];
a[2] = new int[3];
a[3] = new int[4];
a[0][0] = 0;
a[1][0] = Integer.parseInt(str[0]);a[1][1] = Integer.parseInt(str[1]);
a[2][0] = Integer.parseInt(str[2]);a[2][1] = Integer.parseInt(str[3]);a[2][2] = Integer.parseInt(str[4]);
a[3][0] = Integer.parseInt(str[5]);a[3][1] = Integer.parseInt(str[6]);a[3][2] = Integer.parseInt(str[7]);a[3][3] = Integer.parseInt(str[8]);
if(isshu(a)){
num++;
}
} else {
for (int i = start; i < end; i++) {
if (i == 0 && str[0].equals("0"))
continue;
swap(str, start, i);
permutation(str, start + 1, end);
swap(str, start, i);
}
}
}
static boolean isshu(int a[][]){
boolean b = false;
if(a[0][0]<a[1][0]&&a[0][0]<a[1][1]/*a[0][0]*/ &&a[1][0]<a[2][0]&&a[1][0]<a[2][1]/*a[1][0]*/ &&a[1][1]<a[2][1]&&a[1][1]<a[2][2]/*a[1][1]*/ &&a[2][0]<a[3][0]&&a[2][0]<a[3][1]/*a[2][0]*/ &&a[2][1]<a[3][1]&&a[2][1]<a[3][2]/*a[2][1]*/ &&a[2][2]<a[3][2]&&a[2][2]<a[3][3]/*a[2][2]*/){
b = true;
}
return b;
}
截图:
768
浙公网安备 33010602011771号