小明最近喜欢搭数字积木,
一共有10块积木,每个积木上有一个数字,0~9。
搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。
下面是两种合格的搭法:
0
1 2
3 4 5
6 7 8 9
0
3 1
7 5 2
9 8 6 4
请你计算这样的搭法一共有多少种? 答案:768
解析:题意中数字0-9分别且只出现一次,这个题也可以用全排列的方法来做,当然并不是所有的数字都得全排列,依照题目的要求4层中第1层数字一定是0,所以只需要数字0全排列即可,依题意第一个0不用判断,最后一行也不用判断,只需要判断第二行和第三行即可
具体解析:创建一个int类型的数组(c[10]) int[] c = {0,1,2,3,4,5,6,7,8,9},用全排列把以0开头的所有排列找出来,
进行以下判断:
if(c[0]==0)
{ /
if((c[1]<c[3]&&c[1]<c[4])&&(c[2]<c[4]&&c[2]<c[5]))
{
if((c[3]<c[6]&&c[3]<c[7])&&(c[4]<c[7]&&c[4]<c[8])&&(c[5]<c[8]&&c[5]<c[9]))
{
cnt++;
}
}
}
代码如下:(耗时 15ms 左右)
public class 搭积木
{
private static int cnt = 0; //计算符合题目要求的个数
private static long Begin = 0; //与本题无关,只是计算整个程序的耗时
private static long Last = 0; //与本题无关,只是计算整个程序的耗时
public static void Swap(int[] c,int i,int j)
{
int tmp = c[i];
c[i] = c[j];
c[j] = tmp;
}
public static void AllPermutation(int[] c,int start) //全排列算法把0-9的排序都找出来
{
if(start==c.length-1) //该条件说明了已找到一个0-9排列
{
if(c[0]==0) //依照题目要求,第一行一定是0才可以
{ //只需要判断第二行和第三行即可,因为第一行一定是0,第四行向下已经没有数了
if((c[1]<c[3]&&c[1]<c[4])&&(c[2]<c[4]&&c[2]<c[5]))
{
if((c[3]<c[6]&&c[3]<c[7])&&(c[4]<c[7]&&c[4]<c[8])&&(c[5]<c[8]&&c[5]<c[9]))
{
cnt++; //三个判断条件都满足才可以
}
}
}
else //只需要找第一个数为0的排列即可,第一个数大于0不符合要求,直接输出结果退出即可
{
System.out.println(cnt);
Last = System.currentTimeMillis() - Begin; //与本题无关,只是计算整个程序的耗时
System.out.println("耗时:"+Last+"ms"); //与本题无关,只是计算整个程序的耗时
System.exit(0);
}
}
else
{
for(int i=start,t=c.length;i<t;++i) //全排列算法
{
Swap(c,i,start);
AllPermutation(c,start+1);
Swap(c,start,i);
}
}
}
public static void main(String[] args)
{
int[] c = {0,1,2,3,4,5,6,7,8,9};
Begin = System.currentTimeMillis(); //与本题无关,只是计算整个程序的耗时
AllPermutation(c,0); //全排列算法把0-9的排序都找出来
}
}
输出结果:
768
耗时:10ms