1. 程式人生 > >一個差三角問題的窮舉法解決

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


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

廢話不多說了,直接看題

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

標題:計算差三角
仔細觀察下面的數字組成的三角形:
    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:大家要是有什麼更棒的做法可以給我評論,歡迎你。

相關推薦

一個三角問題的解決

今年再次報名了藍橋杯演算法程式設計比賽,去年沒能進全國賽區的比賽總覺得有些遺憾,雖說自己不是什麼牛人,但是就憑藉著我這一顆熱愛程式設計的心,也該讓我進的呀。。。 廢話不多說了,直接看題 --------------------------------------------

C++實踐參考解答 解決組合問題

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

利用解決01揹包問題

01揹包動態規劃演算法可能有很多人不理解,貼出一個利用遞迴窮舉法解決01揹包問題的程式碼 package homework; import java.util.ArrayList; import java.util.List; import java.ut

C++實驗4-解決百錢買百雞

一、問題及程式碼 /* * 檔名稱:lee * 作 者:李振盛 * 完成日期:2016 年 4 月 7 日 * 版 本 號:v1.0 * 對任務及求解方法的描述部分: * 輸入描述:無 * 問題描述: 用窮舉法解決百錢買百雞的問題 * 程式輸出

常用算-

sdn 方法 多少 自身 clas 設置 HR AR 一種可能 窮舉法又稱為枚舉法,它是在計算機算法設計中用得最多的一種編程思想。它的實現方式是:在已知答案範圍的情況下,依次地枚舉該範圍內所有的取值,並對每個取值進行考查,確定是否滿足條件。經過循環遍歷之後,篩選出符合要求的

判斷鍵入的數是不是素數

AI ber pri AR number clas AS flag stdio.h #include <stdio.h> int main(int argc, char *argv[]) { int num,i; bool flag = tr

六中常用演算法設計:、分治法、動態規劃、貪心、回溯和分支限界

演算法設計之六種常用演算法設計方法 1.直接遍歷態(窮舉法)        程式執行狀態是可以遍歷的,遍歷演算法執行每一個狀態,最終會找到一個最優的可行解;適用於解決極小規模或者複雜度線性增長,而線

leetcode 144 145 二叉樹的遍歷 141 142 環狀連結串列 149

[144] binary-tree-preorder-traversal 二叉樹的前序遍歷 使用棧,不用遞迴 /** * Definition for binary tree * public class TreeNode { * int val; * TreeNod

思想(素數)

窮舉法(Exhaustive Attack method),又稱為強力法(Brute-force method),它是一種最為直接,實現最為簡單,同時又最為耗時的一種解決實際問題的演算法思想。 基本概念 窮舉法的基本思想是:在可能的解空間中窮舉出每一種可能的解,並對每一個

求1000內所有完數

題目:   一個數如果恰好等於它的因子之和,這個數就稱為 "完數",   例如6=1+2+3。程式設計找出1000以內的所有完數。 思路: 窮舉法(簡直就是萬能的存在~) 程式碼: package day5; public class&nb

的另外一些題目

將A,B,C,D,E,F,G,H這8個變數排成如圖所示的大梯形和4個小梯形,這8個變數分別取[1……8]上的整數且互不相等。求使如圖所示的梯形和四個小梯形四個角上的變數之和全相等的所有解。 1+4+6+7=1+4+5+8=5+4+3+6=3+2+8+5=7+2+8+1 大梯

PHP實現一個hash表(拉鍊解決hash衝突)程式碼例項

<?php header('Content-type:text/html;charset=utf-8'); class HashTable{ private $buckets; private $size = 10; public function __const

雞兔同籠(附java程式碼)——解題

窮舉法:暴力破解,n層for迴圈。列舉每一種可能。例題:雞兔同籠:一個籠子有35個頭,94只腳,問雞和兔各有多少?解題:數學方法:設雞i只,兔j只,方程:i + j = 35   ;  2 * i + 4 * j = 94。解題思路:雞和兔加起來35只,所以算每一種可能的腳的

的應用舉例

程式碼如下: /* *作者:王爭取 *問題描述:百錢百雞問題:中國古代數學家張丘建在他的《算經》裡提出著名的“百錢百雞”問題: 雞翁一,值錢五,雞母一,值錢三,雞稚一,值錢一,百錢買百雞問:翁,母,

Matlab 應用 切割問題 (筆記)

窮舉法應用例項 (切割問題) matble 將一根長為350cm的條材切割成 72cm 55 cm 43 cm 的三種型號,有多種切割方式 求每種型號至少有一根,請找出餘料最少的切割方式? 問題分析: 對長度為X的成品,條材最多能切割【350]根,

【行易少兒程式設計】10.Python 小學線性方程題目的解答-兩種程式設計方法:及方程等的比較

下面這道題目,是小學很常見的數學題目,除了慣用的解題方法外,通過程式設計也可以解答。某班級的總人數為64人。女生比男生的一半多7人。請問:男女生分別是多少?第一種程式設計方法:窮舉法for intboys in range(0,65):    for intgirls in

數模演算法-網格演算法和

網格演算法和窮舉法一樣,只是網格法是連續問題的窮舉。 比如要求在 N 個變數情況下的最優化問題,那麼對這些變數可取的空間進行採點, 比如在 [ a; b ] 區間內取 M +1 個點,就是 a; a

演算法其實很有趣之——、遞推、遞迴、分治、概率(演算法需有通用性)

窮舉法 雞兔同籠問題:今有雞兔同籠,上有35頭,下有94足,問雞兔各幾何? 這個問題曾經我的一個商人朋友跟我講起過,像大多數人一樣,我從數學的角度出發,設雞有 x 只,兔有 y 只, x + y = 35 並且 2*x + 4*y = 94,正當我忙於計算出結 果的時候,

題解:猜數字——的應用

【題目】在下面的加法算式中,不同的符號代表不同的數字,相同的符號代表相同的數字。請設計程式求出"都、要、學、C"4個符號分別代表的數字。          學  C      要  學  C+ 都  要  學  C________________  2   0   0   8

C 語言程式設計 6.15 雞兔同籠,共有98個頭,386只腳。請用程式設計計算雞,兔各多少隻。

數學思想: x + y = 98   // x 只雞  y只兔子 2 x +  4(98-x) =  386 ; 得出 x 帶入 x + y = 98 ; 以上為數學解法,下面轉化為程式設計。 程式設計思想: x 的取值範圍 從 0 到 98  對應 y 的取值