#include<bits/stdc++.h>
#define ll long long
#include<set>
using namespace std;
int a[10]={0,1,2,3,4,5,6,7,8,9};
ll q[10];
set<string>s;
void dfs(int step,int num)///step代表搜索的深度,num代表这一组中有几个数
{
if(step==10)///如果已经用完所有的10个数
{
ll qq[10];
for(int i=0;i<num;i++)
{
qq[i]=q[i];
}
sort(qq,qq+num); ///一定要排序不然相同的数,不同的排列,则会被统计为两种。
string tmp;
char str[100];
for(int i=0;i<num;i++)
{
sprintf(str,"%lld",qq[i]);///转换成字符串
tmp+=str;
tmp+="-";
}
// cout<<tmp<<endl;
s.insert(tmp);;///利用去重的特性插入
return;
}
if(a[step]==0)///0也是一个完全平方数
{
q[num]=0;
dfs(step+1,num+1);
}
else
{
ll sum=0;
for(int i=step;i<10;i++)
{
sum=sum*10+a[i];///算出当前所得到的值
double son=sqrt(sum);
if(son==(int)son)///构成一个完全平方数
{
q[num]=sum;
dfs(i+1,num+1);
}
}
}
}
int main()
{
do
{
memset(q,0,sizeof(q));
dfs(0,0);
}while(next_permutation(a,a+10));
cout<<s.size()<<endl;
}
[蓝桥杯2016决赛]凑平方数
最新推荐文章于 2021-02-13 11:01:39 发布