搭積木(藍橋杯)

小明最近喜歡搭數字積木,

一共有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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章