蓝桥 凑平方数 (我依旧很菜)

简介: 蓝桥 凑平方数 (我依旧很菜)

把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的。
比如:0, 36, 5948721

再比如:
1098524736
1, 25, 6390784
0, 4, 289, 15376
等等...

注意,0可以作为独立的数字,但不能作为多位数字的开始。
分组时,必须用完所有的数字,不能重复,不能遗漏。

如果不计较小组内数据的先后顺序,请问有多少种不同的分组方案?


其实一开始i想到了要用next_permutation和dfs,但是具体的思路想不通。
看了学长的代码才会做。记录一下。

#include<cstdio>
#include<cmath>
#include<string>
#include<vector>
#include<set>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;

int a[20]={
   0,1,2,3,4,5,6,7,8,9};
set<string> st;
bool judge(ll x){
   
    if(!x)    return 1;
    ll tmp = (ll)sqrt(x);
    return tmp*tmp == x;
}
void dfs(int pos, vector<ll> v){
   
    if(pos == 10){
   
        sort(v.begin(),v.end());
        string ans="";
        for(int i=0; i<v.size(); i++){
   
            char t[32];
            sprintf(t, "%lld", v[i]);
            ans = ans +" "+t;
        }
        //cout<<ans<<endl;
        st.insert(ans);
        return;
    }
    ll tmp=0;
    if(a[pos]==0){
   
        v.push_back(0);
        dfs(pos+1,v);
    }else{
   
        for(int i=pos; i<=9; i++){
   
            tmp = tmp*10+a[i];
            if(judge(tmp)){
   
                v.push_back(tmp);
                dfs(i+1, v);
                v.pop_back();
            }
        }
    }
}
int main(){
   
    do{
   
        vector<ll> v;
        v.clear();
        dfs(0, v);
    }while(next_permutation(a, a+10));
    printf("%d\n", st.size());
    return 0;
}
相关文章
|
3月前
|
算法 测试技术
枚举(蓝桥练习)(反倍数、特别数的和、找到最多的数、小蓝的漆房、小蓝和小桥的挑战)
枚举(蓝桥练习)(反倍数、特别数的和、找到最多的数、小蓝的漆房、小蓝和小桥的挑战)
|
3月前
|
算法 测试技术 C++
【动态规划】【状态压缩】【C++算法】1815 得到新鲜甜甜圈的最多组数
【动态规划】【状态压缩】【C++算法】1815 得到新鲜甜甜圈的最多组数
|
3月前
特别数的和(蓝桥杯)
特别数的和(蓝桥杯)
|
3月前
|
C++
[蓝桥杯 2023 省 A] 填空问题--幸运数
[蓝桥杯 2023 省 A] 填空问题--幸运数
37 0
|
数据采集 数据挖掘 Python
【每周一坑】乒乓数
刚从假期回来,又要迎接周末,各位看官想必都很辛苦,所以本周每周一坑为大家准备一道简单的甜点题目,本题取材于伯克利大学 CS61 课程 homework02。
|
9月前
|
算法 Java
代码随想录算法训练营第三十四天 | LeetCode 860. 柠檬水找零、406. 根据身高重建队列、452. 用最少数量的箭引爆气球
代码随想录算法训练营第三十四天 | LeetCode 860. 柠檬水找零、406. 根据身高重建队列、452. 用最少数量的箭引爆气球
51 0
|
算法 索引
代码随想录训练营day34| 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果...
代码随想录训练营day34| 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果...
|
存储
【每日一题Day95】LC1815得到新鲜甜甜圈的最多组数 | 状态压缩dp 记忆化搜索
子问题、哪些操作会影响数据:余下的甜甜圈数量left,以及剩余可以选的元素个数 cnt[x]【dfs函数的两个参数->使用状态压缩至一个int类型变量中】
102 0
【每日一题Day95】LC1815得到新鲜甜甜圈的最多组数 | 状态压缩dp 记忆化搜索
代码随想录刷题|LeetCode 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
代码随想录刷题|LeetCode 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
代码随想录刷题|LeetCode 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
|
机器学习/深度学习 算法 安全
【Python 百练成钢】时间调整、二进制数、回文素数、字母距离、CTF、Huffuman树、抽奖、前后缀最值、纯质数求解、花园灌溉
【Python 百练成钢】时间调整、二进制数、回文素数、字母距离、CTF、Huffuman树、抽奖、前后缀最值、纯质数求解、花园灌溉
208 0
【Python 百练成钢】时间调整、二进制数、回文素数、字母距离、CTF、Huffuman树、抽奖、前后缀最值、纯质数求解、花园灌溉