蓝桥杯真题:凑平方数

问题描述
把 0 ~ 9 这 10 个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的。

比如:0,36,5948721
再比如:{1098524736};
{1,25,6390784};
{0,4,289,15376}
等等…

注意,0 可以作为独立的数字,但不能作为多位数字的开始。

分组时,必须用完所有的数字,不能重复,不能遗漏。

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

答案提交
注意:需要提交的是一个整数,不要填写多余内容。

答案:300

思路:
1、不要单纯的按照题目模拟,把数字截取来判断是不是平方数,难度增加不少;应该把0到9876543210中的无重复数字的平方数选取出来进行组合,这就是容易了,简单的DFS组合问题;

我的代码:

#include<bits/stdc++.h>
using namespace std;
vector<string> v;
int flag[10] = {0},cnt = 0;
bool judge(string str)//判断一串数字中是否有重复数字
{
	fill(flag,flag+10,0);
	for (int i = 0 ;i < str.size() ;i++)
	{
		if (flag[str[i]-'0'] == 1) return false;
		flag[str[i]-'0']++;
	}		
	return true;
}
void DFS(int index,string str)
{	
	if (str.size() == 10 && judge(str)) cnt++;
	if (index == v.size() || str.size() >= 10) return;
	DFS(index + 1,str+v[index]);
	DFS(index + 1,str); 
}
int main()
{
	for (long long i = 0 ;i * i <= 9876543210 ;i++)
	{
		string str;
		stringstream ss;//把数字转化为用字符串
		ss << i * i;
		ss >> str;
		if (judge(str)) v.push_back(str);//把含重复数字的平方数过滤,大大提高了效率
		ss.clear();
	}
	DFS(0,"");
	printf("%d",cnt);	
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

情书、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值