601
技術社區[雲棲]
一個差三角問題的窮舉法解決
今年再次報名了藍橋杯算法程序設計比賽,去年沒能進全國賽區的比賽總覺得有些遺憾,雖說自己不是什麼牛人,但是就憑借著我這一顆熱愛編程的心,也該讓我進的呀。。。
廢話不多說了,直接看題
----------------------------------------------------------------------------------------------------------------------------------------------------
標題:計算差三角仔細觀察下麵的數字組成的三角形:
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:大家要是有什麼更棒的做法可以給我評論,歡迎你。
最後更新:2017-04-03 19:13:18
上一篇:
Android 5.0 將延期發布 無緣穀歌 I/O 2013大會
下一篇:
64 位 x86 處理器誕生 10 周年
Why Apache Beam? A data Artisans perspective
讓你的 Linux 遠離黑客(三):FAQ
華為加入 OpenStack,表示願意公開軟件源代碼
FastReport 使用技巧
給seo外鏈員的一些忠告
Oracle 12c新特性:多租戶中使用 CONTAINERS 語句跨越PDB查詢
【SVN】(四)新項目搭建後相關報錯(2016-04-28)
最近我在學習c++,為android項目做準備。
Spring注解(Annotations)書目錄
了解ASP.NET MVC幾種ActionResult的本質:JavaScriptResult & JsonResult