今年再次报名了蓝桥杯算法程序设计比赛,去年没能进全国赛区的比赛总觉得有些遗憾,虽说自己不是什么牛人,但是就凭借着我这一颗热爱编程的心,也该让我进的呀。。。
废话不多说了,直接看题
----------------------------------------------------------------------------------------------------------------------------------------------------
标题:计算差三角仔细观察下面的数字组成的三角形:
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:大家要是有什么更棒的做法可以给我评论,欢迎你。