一个差三角问题的穷举法解决

简介: <br><p>今年再次报名了蓝桥杯算法程序设计比赛,去年没能进全国赛区的比赛总觉得有些遗憾,虽说自己不是什么牛人,但是就凭借着我这一颗热爱编程的心,也该让我进的呀。。。<img alt="哭" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/cry.gif"></p> <p>废话不多说了,直接看题</p>

今年再次报名了蓝桥杯算法程序设计比赛,去年没能进全国赛区的比赛总觉得有些遗憾,虽说自己不是什么牛人,但是就凭借着我这一颗热爱编程的心,也该让我进的呀。。。哭

废话不多说了,直接看题

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

标题:计算差三角
仔细观察下面的数字组成的三角形:
    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:大家要是有什么更棒的做法可以给我评论,欢迎你。


目录
相关文章
|
8月前
|
算法 Java 程序员
认识复杂度、对数器、二分法
认识复杂度、对数器、二分法
62 1
欧拉筛(最优的方法,对于找质数,细节讲解)
欧拉筛(最优的方法,对于找质数,细节讲解)
141 0
|
7月前
|
机器学习/深度学习 算法 Serverless
利用无穷级数逼近计算幂运算与开根号——Python实现
使用泰勒级数逼近法,本文介绍了如何用Python计算特殊幂运算,包括分数次幂和开根号。通过定义辅助函数,如`exp`、`getN_minus_n`、`multi`和`getnum`,实现了计算任意实数次幂的功能。实验结果显示,算法能有效计算不同情况下的幂运算,例如`0.09^2`、`1^2`、`0.25^2`、`0.09^(0.5)`、`1^(0.5)`和`0.25^(0.5)`。虽然精度可能有限,但可通过调整迭代次数平衡精度与计算速度。
|
8月前
考研高数之无穷级数题型一:判断收敛性、求收敛半径以及收敛域和收敛区间(题目讲解)
考研高数之无穷级数题型一:判断收敛性、求收敛半径以及收敛域和收敛区间(题目讲解)
452 0
|
算法
质数筛法:朴素素数筛,埃氏筛,欧式筛
质数筛法:朴素素数筛,埃氏筛,欧式筛
163 0
再学一道算法题: 二分法求多项式单根
再学一道算法题: 二分法求多项式单根
再学一道算法题: 二分法求多项式单根
再学一道算法题:矩阵A乘以B
再学一道算法题:矩阵A乘以B
再学一道算法题:矩阵A乘以B
|
机器学习/深度学习
【组合数学】递推方程 ( 常系数线性非齐次递推方程 的 非齐次部分是 多项式 与 指数 组合方式 | 通解的四种情况 )
【组合数学】递推方程 ( 常系数线性非齐次递推方程 的 非齐次部分是 多项式 与 指数 组合方式 | 通解的四种情况 )
231 0