一個差三角問題的窮舉法解決


今年再次報名了藍橋杯算法程序設計比賽,去年沒能進全國賽區的比賽總覺得有些遺憾,雖說自己不是什麼牛人,但是就憑藉着我這一顆熱愛編程的心,也該讓我進的呀。。。哭

廢話不多說了,直接看題

----------------------------------------------------------------------------------------------------------------------------------------------------

標題:計算差三角
仔細觀察下面的數字組成的三角形:
    3
   1 4
  5 6 2
看出什麼特徵嗎?
首先,它包含了1~6的連續整數。
重要的是:每個數字都是其下方相鄰的兩個數字的差(當然是大數減去小數)
滿足這樣特徵的三角形,稱爲:差三角。
你的任務是找出1~15的整數組成的一個更大的差三角。其形如:
      ?
     4 ?
    ? ? ?
   * ? ? ?
  ? ? ? ? ?
其中,只給出了一個確定的數字:4
請確定出“*” 代表的是哪個一個數字。

直接提交該數字,不要提交多餘的內容。

----------------------------------------------------------------------------------------------------------------------------------------------------

分割線之間的內容就是原題目(這是模擬題,C語言A組別)描述,每次看到“直接提交該數字,不要提交多餘的內容”這樣的題目描述時我都覺得牛人和像我這樣菜鳥的區別,也許大牛們很快能看出題目之中的“bug”,然後以一種快速而巧妙的算法得出最終答案,說到這裏再次膜拜一下Matrix67大牛

我這裏也沒用什麼動態規劃、回溯法,這些算法比較難,我沒能理解透徹,我就直接用最基本的窮舉法來解題。

從題目描述中可以看出,只要最後5個數確定了,然後其他數都可以算出來了,所以我們這裏窮盡這5個數,直到得到正確排列方式爲止。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int ele[5][5];
int num[16]; //記錄1--15個數出現的次數,0號元素沒有使用

void init()
{
	for(int i=0;i<16;i++)
	{
		num[i]=0;
	}
}
int check()
{
	for(int row=0;row<5;row++)
		for(int col=0;col<row+1;col++)
		{
			num[ele[row][col]]++;//記錄數字ele[row][col]出現的次數
		}
		
		for(int i=1;i<16;i++)//如果num[1---15]中的元素的值都爲1,則當前組合把1--15數字都用了一遍,且僅用了一遍
		{
			if(num[i]!=1) 
			{
				init();
				return 0;
			}
			
		}
		
		return 1;
}
void printarr()
{
	for(int row=0;row<5;row++)
	{
		for(int col=0;col<row+1;col++)
			printf("%d  ",ele[row][col]);
		printf("\n");
	}
	
}
void main()
{	
	for(int i=1;i<=15;i++)
	{
		ele[4][0]=i;
		for(int j=1;j<=15;j++)
		{
			ele[4][1] = j;
			for(int k=1;k<=15;k++)
			{
				ele[4][2] = k;
				for(int m=1;m<=15;m++)
				{
					ele[4][3] =m;
					for(int n=1;n<=15;n++)
					{
						ele[4][4] = n;
						
						for(int row=3;row>=0;row--)
						{
							for(int col=0;col<=row;col++)
							{
								ele[row][col] = abs(ele[row+1][col]-ele[row+1][col+1]);
								
							}
						}
						if(check()==1)
						{
							if(ele[1][0]==4) {
								printarr();
								return;
							}
							
						} 
						
						
					}
				}
				
			}
			
		}
		
	}
	
}

代碼上有註釋,大家應該都能看懂。(這幾天爭取把回溯法看懂,到時候再用回溯法解決這個問題)

結果輸出:



PS:大家要是有什麼更棒的做法可以給我評論,歡迎你。


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