问题描述
把 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;
}