1. 问题描述:
小明最近喜欢搭数字积木,
一共有10块积木,每个积木上有一个数字,0~9。搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。下面是两种合格的搭法:
0
1 2
3 4 5
6 7 8 90
3 1
7 5 2
9 8 6 4请你计算这样的搭法一共有多少种?
请填表示总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。768
2. 仔细分析一下题目可以知道这个题目是全排列演变过来的一个题目,我们可以求解出0-9的全排列然后在出口进行判断看相应的位置是否满足要求,假如满足那么计数加1
代码如下:
public class Main{
static int count;
public static void main(String[] args) {
//其实就是全排列
char arr[] = "0123456789".toCharArray();
solve(arr, 0);
System.out.println(count);
}
private static void solve(char[] arr, int k) {
if(k == arr.length - 1){
isOk(arr);
return;
}
for(int i = k; i < arr.length; i++){
char c = arr[k];
arr[k] = arr[i];
arr[i] = c;
solve(arr, k + 1);
c = arr[k];
arr[k] = arr[i];
arr[i] = c;
}
}
private static void isOk(char[] arr) {
if(arr[0] > arr[1]) return;
if(arr[0] > arr[2]) return;
if(arr[1] > arr[3]) return;
if(arr[1] > arr[4]) return;
if(arr[2] > arr[4]) return;
if(arr[2] > arr[5]) return;
if(arr[3] > arr[6]) return;
if(arr[3] > arr[7]) return;
if(arr[4] > arr[7]) return;
if(arr[4] > arr[8]) return;
if(arr[5] > arr[8]) return;
if(arr[5] > arr[9]) return;
count++;
}
}
我们也可以输出其中的过程来检验自己的结果到底对不对
public class Main{
static int count;
public static void main(String[] args) {
//其实就是全排列
char arr[] = "0123456789".toCharArray();
solve(arr, 0);
}
private static void solve(char[] arr, int k) {
if(k == arr.length - 1){
isOk(arr);
//System.out.println(String.valueOf(arr));
return;
}
for(int i = k; i < arr.length; i++){
char c = arr[k];
arr[k] = arr[i];
arr[i] = c;
solve(arr, k + 1);
c = arr[k];
arr[k] = arr[i];
arr[i] = c;
}
}
private static void isOk(char[] arr) {
if(arr[0] > arr[1]) return;
if(arr[0] > arr[2]) return;
if(arr[1] > arr[3]) return;
if(arr[1] > arr[4]) return;
if(arr[2] > arr[4]) return;
if(arr[2] > arr[5]) return;
if(arr[3] > arr[5]) return;
if(arr[3] > arr[6]) return;
if(arr[4] > arr[6]) return;
if(arr[4] > arr[7]) return;
if(arr[5] > arr[7]) return;
if(arr[5] > arr[8]) return;
print(arr);
count++;
}
private static void print(char[] arr) {
int pos = 0;
for(int i = 1; i <= 4; i++){
for(int j = 0; j < 4 - i; j++){
System.out.print(" ");
}
for(int k = pos; k < pos + i; k++){
System.out.print(arr[k] + " ");
}
pos += i;
System.out.print("\n");
}
System.out.print("\n");
}
}
部分结果如下: