小明最近喜歡搭數字積木,
一共有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