凑平方数
把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的。
比如:0, 36, 5948721
再比如:
1098524736
1, 25, 6390784
0, 4, 289, 15376
等等...
注意,0可以作为独立的数字,但不能作为多位数字的开始。
分组时,必须用完所有的数字,不能重复,不能遗漏。
如果不计较小组内数据的先后顺序,请问有多少种不同的分组方案?
注意:需要提交的是一个整数,不要填写多余内容。
逐渐见识到搜索题目的强大;首先要理清思路,然后逐步分布的进行后续的想法与步骤,逐步筛选方式方法
很多0~9的问题都是通过全排列实现,这是一种很好的方法
set去重
通过测试来逐步分割,巧妙实现
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <set>
using namespace std;
set<string>S;
int a[10]={0,1,2,3,4,5,6,7,8,9};
long long shu1[10];
void dfs(int cur,int num)
{
if(cur==10)
{
long long shu2[10];
for(int i=0;i<num;i++)
{
shu2[i]=shu1[i];
}
sort(shu2,shu2+num);
string xu;
for(int i=0;i<num;i++)
{
while(shu2[i])
{
int a;
a=shu2[i]%10;
shu2[i]/=10;
char b=a+'0';
xu+=b;
}
xu+='-';
}
S.insert(xu);
return ;
}
if(a[cur]==0)
{
shu1[num]=0;
dfs(cur+1,num+1);
}
else
{
long long sum=0;
for(int i=cur;i<10;i++)
{
sum=sum*10+a[i];
double son=sqrt(sum);
if(son==(int)son)
{
shu1[num]=sum;
dfs(i+1,num+1);
}
}
}
}
int main()
{
do
{
memset(shu1,0,sizeof(shu1));
dfs(0,0);
}while(next_permutation(a,a+10));
cout << S.size() << endl;
return 0;
}