凑平方数
把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的。
比如:0, 36, 5948721
再比如:
1098524736
1, 25, 6390784
0, 4, 289, 15376
等等...
注意,0可以作为独立的数字,但不能作为多位数字的开始。
分组时,必须用完所有的数字,不能重复,不能遗漏。
如果不计较小组内数据的先后顺序,请问有多少种不同的分组方案?
注意:需要提交的是一个整数,不要填写多余内容。
注意答案是300,这个题目用递归来做比较好,欢迎来喷
#include <iostream>
#include<vector>
#include<string>
#include<string.h>
using namespace std;
string aa[700];
string bb[110];
int bi=0;
int ai=0;
int cnt=0;
int ws=0;
int biao[10]={0};
int check1(long long a)
{
for(int i=0;i<=9;i++)
{
int count=0;
long long b=a;
while(b!=0)
{
int c=b%10;
if(c==i)
count++;
if(count>1)
return 0;
b/=10;
}
}
return 1;
}
string ts(long long a)
{ string ppp="";
int ci=0;
if(a==0)
ppp="0";
else
{
while(a!=0)
{int c=a%10;
ppp=(char)(c+48)+ppp;
ci++;
a/=10;
}
}
return ppp;
}
int check2(string p)
{
for(int i=0;i<p.size();i++)
{
if(biao[p[i]-48]==1)
return 0;
}
return 1;
}
//进行回溯
void biaoji(string str)
{
for(int i=0;i<str.size();i++)
{
biao[str[i]-48]=1;
}
}
void fbiaoji(string str)
{
for(int i=0;i<str.size();i++)
{
biao[str[i]-48]=0;
}
}
int check3()
{
for(int i=0;i<10;i++)
if(biao[i]==0)
return 0;
return 1;
}
void dfs(int ws,int c,int ti)
{
if(ws==10)//递归的终止条件
{
return;
}
for(int i=ti+1;i<ai;i++)//然后是整个大循环,这个数是包括排列的,并不是说个数唯一且派利唯一
{
if(ws+aa[i].size()>10)//如果现有的位数加上这一个位数会超的话,那么后面的一定超
return;
else if(!check2(aa[i]))//如果位数不超的话,那么我们的数字如果已经有的位数被标记过,那么执行下一个
continue;
else if(ws+aa[i].size()<=10&&check2(aa[i]))
{
biaoji(aa[i]);
bb[c]=aa[i];
if(ws+aa[i].size()==10)
{
cnt++;
for(int j=0;j<=c;j++)
cout<<bb[j]<<" ";
cout<<endl;
fbiaoji(aa[i]);
}
dfs(ws+aa[i].size(),c+1,i);
fbiaoji(aa[i]);
}
}
}
int main()
{
for(long long i=0;i<1000000000;i++)
if((long long)(i*i)<10000000000ll)
{
if(check1(i*i))
{
string p=ts(i*i);
aa[ai]=p;
ai++;
}
}
dfs(0,0,-1);//制表完成,格式为字符串 最后一个参数是用来空置每次递归循环的头部是来源于上一个递归的位置加1
cout<<cnt<<endl;
return 0;
}