搭积木
小明最近喜欢搭数字积木,
一共有10块积木,每个积木上有一个数字,0~9。
搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。
下面是两种合格的搭法:
0
1 2
3 4 5
6 7 8 9
0
3 1
7 5 2
9 8 6 4
请你计算这样的搭法一共有多少种?
请填表示总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
思想:此处的数据量不是很大,因此采用直接对数据全排列的方式,然后对排列后的数据进行判断是否满足题目要求的搭法(很暴力)
小明最近喜欢搭数字积木,
一共有10块积木,每个积木上有一个数字,0~9。
搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。
下面是两种合格的搭法:
0
1 2
3 4 5
6 7 8 9
0
3 1
7 5 2
9 8 6 4
请你计算这样的搭法一共有多少种?
请填表示总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
思想:此处的数据量不是很大,因此采用直接对数据全排列的方式,然后对排列后的数据进行判断是否满足题目要求的搭法(很暴力)
class Main {
public static void main(String[] args) {
f();
System.out.println(sum);
}
//定义一个数据进行保存所有的可能性
public static int sum = 0;
private static void f()
{
int a[] = new int[]{0,1,2,3,4,5,6,7,8,9};
//对a中的数据进行全排列
fun(a,0);
}
/*
* 第i个位置的数据用后面的所有的来坐
*/
private static void fun(int[] a, int i) {
//全部排列一次成功
if(i>=9)
{
//全排列完毕的数据进行判断是否可以组成规定的三角图形
if(isOk(a))
{
sum++;
}
}
else
{
//进行下一次的全排列
for(int j = i;j<=9;j++)
{
swap(a,i,j);
fun(a,i+1);//每选一个来坐这个位置之后,在进行下一个位置的人选选择
swap(a,i,j);
}
}
}
//判断排列好的是否满足条件
private static boolean isOk(int[] a) {
//定义一个二维数组用于存放数据
int b[][] = new int[4][4];
int n = 0;
for(int i = 0;i<=3;i++)
{
for(int j = 0;j<=i;j++)
{
b[i][j] = a[n++];
}
}
//判断是否满足条件
for(int i = 0;i<3;i++)
{
for(int j = 0;j<=i;j++)
{
if(b[i+1][j]<b[i][j]||b[i+1][j+1]<b[i][j])
return false;
}
}
return true;
}
private static void swap(int[] a, int i, int j) {
// TODO Auto-generated method stub
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
答案:768
华love邵