刚刚搞完蓝桥杯,题目比以往要难得多第二题就花了很多时间不过没有做出来,事后仔细琢磨了一下终于想出来了怎么做
题目的意思大致是这样的
0~9这是个数字进行分组得到若干组合这些组合中有一些
每一组数据都可以是凑成完全平方数的
比如 1 760384 529和 0 4 25 391876
这样的分组有多少
通过对于题目分析我们可以知道实质是要0~9 的子集合(有1024个)中寻找元素可以组成完全平方数的集合子集合
再在这些可行的子集合中寻找可以组成0~9的集合的元素为了不必要的枚举首先在0~100000中寻找他们的平方数
在他们的平方数中剔除不可行的平方数比如121和144在将每一位的出现的关系映射到子集合数组中位置
比如
125 的出现关系数组就是
数字 0 1 2 3 4 5 6 7 8 9
出现与否 0 1 1 0 0 1 0 0 0 0
将出现的数组(v[i] = 1表示第i个元素出现)
按二进制转换成为十进制这样的十进制就是要存储的坐标
在将这些子集合中去取出满足条件的子集合比如就是看是否子集合
的元素可以不重复而且可以组成0~9的集合可以利用dfs搜索完成这个寻找
好了直接上C++代码
#include <iostream>
#include <cstring>
#include <cmath>
#include <vector>
#include <bitset>
using namespace std;
struct set_num //定义集合结构体
{
int len = 0; //数字的数目
bitset <10> have; //哪些数字被使用
long long value;//所代表的