第七届蓝桥杯决赛试题: 凑平方数

题目:


凑平方数

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

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

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

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

注意:需要提交的是一个整数,不要填写多余内容。
代码<仅供参考>
// 凑平方数
#include <bits/stdc++.h>
using namespace std;

int arr[10] = {0,1,2,3,4,5,6,7,8,9};
long long nums[10];
set<string> sset;


bool issqr(long long num)
{
    double tmp = sqrt(num);
    return tmp == (long long) tmp;
}

string to_string(long long num)
{
    ostringstream ostr;
    ostr << num;
    return ostr.str();
}


// n表示已经选了几个数,i表示滑到了哪个数字 
void dfs(int i, int n)
{
    //若滑到了10,说明滑完了,而且前一段是个完全平方数 
    if(i==10) {
        long long nums_t[10];
        copy(nums,nums+n,nums_t);
        sort(nums_t,nums_t+n);
        string str;
        for(int j=0; j<n; ++j) {
            str += to_string(nums_t[j]) + ",";
        }
        sset.insert(str);
        return ;

    }

    if(arr[i]==0) {
        nums[n] = 0;
        dfs(i+1,n+1);
        return;   // 这里要退出,不然就会漏掉0, 组合数偏大
    }

    // 如果一直滑到最后都不是完全平方数,直接退出,这组数据不满足 
    long long num = 0;
    for(int j=i; j<10; ++j) {
        num = num*10 + arr[j];
        if(issqr(num)) {
            nums[n] = num;
            dfs(j+1,n+1);
        }
    } 
}

int main()
{
    memset(nums, 0, sizeof(int)*10);
    do {
        dfs(0,0);
    }while(next_permutation(arr,arr+10));

    cout << sset.size();

    return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值