第七届蓝桥杯B组决赛 第二题题解

博主还是抽时间把以前写的东西发布上来,由于蓝桥杯比赛结束后不允许把题目带出来,这个题的题目就写个回忆版好了:

给定0-9十个数字,任意组合成一组数字(有前后顺序之分,例如(0,12,3456789)和(0,21,3456789)是不同的组合,当然这两种都不满足后面的条件),使得组成的所有数都是完全平方数(例如0,1,25,36,784,9),求出满足条件的有多少种情况。

 

我的主要思路:

1、先找到所有的符合条件的完全平方数(0<=x^2<=9876543210且各位数字不存在重复项,例如121就不符合)存放到关联数组中,我这里用的是c++自带stl类库<map>,由于自动生成有序序列,其查找方式用的二分查找,可以大大提高效率,有个小地方需要大家注意,特别容易遗漏,就是int型是4字节,9876543210已经超过了其最大整数表示范围,我们需要用8字节的长整型才可以。

2、有了这些数就好办了,我的做法是求出0-9这10个数字的所有组合,由于题目需要考虑不同顺序(因为相同的几个数变换顺序后可能都满足完全平方数的条件),这样的时间复杂度有点大,而且很容易造成重复,但是如果不考虑顺序的话,实现起来相对容易些,如果我们这样想:把0-9这十个数放到不同的集合中,假如说我们生成了一种情况有两个集合A{0,1,2,3,4}和B{5,6,7,8,9},那么这种情况可以有N=(A中经过变换顺序组合得到的满足条件的完全平方数的数目)*(B中经过组合得到的满足条件的完全平方数的数目)种满足题目要求,最后把所有N相加便是最终所求数目。

3、这里我讲一下在不考虑顺序的情况下如何得到所有组合情况,我通过10层递归的方法,每层递归都确定一个数属于哪个集合,在确定的时候用一个数组标记这个数代表哪个集合,且确定的时候只能将其往前面的集合放,这样可以解决重复的问题。

博客代码实现见我的私人博客

http://blog.summerpro.cn/myblog/?p=203

点赞