凑平方数
把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的。
比如:0, 36, 5948721
再比如:
1098524736
1, 25, 6390784
0, 4, 289, 15376
等等...
注意,0可以作为独立的数字,但不能作为多位数字的开始。
分组时,必须用完所有的数字,不能重复,不能遗漏。
如果不计较小组内数据的先后顺序,请问有多少种不同的分组方案?
注意:需要提交的是一个整数,不要填写多余内容。
这种就直接全排列然后深搜。
自己出现的问题:
1. 0没有处理好,如果0出现在中间,最后有可能会导致增多,注意0
2. 越界。。这个BUG调了好多时间没调整好,一个一个输出一点一点找错。发现是越界
把int换成long long。
3. 最后判重直接把得到数组,我是储存在fz【】数组里,然后排序,存入set容器,这点要注意一下
因为同一种顺序有可能有不同的组合方法,所以在每个数字的后面加一个‘,’然后存入set<string> s;容器中
如果自己考试时候做真不一定能做出来,太不细心了
#include<iostream>
#include<algorithm>
#include<set>
#include<cmath>
#include<stack>
#include<string>
using namespace std;
int a[11]={0,1,2,3,4,5,6,7,8,9};
long long fz[100]={0};
set<string> s;
void f(int n,int k){
if(n==9){
/*for(int i=0;i<k;i++){
cout<<fz[i]<<" ";
}*/
long long fz2[100]={0};
for(int i=0;i<k;i++)
fz2[i]=fz[i];
sort(fz2,fz2+k);
string str="";
//set<int> ss;
for(int i=0;i<k;i++){
stack<int> sta;
if(fz2[i]==0)
str+=0+'0';
//ss.insert(0);
long long num=fz2[i];
while(num){
sta.push(num%10);
//ss.insert(num%10);
num/=10;
}
while(sta.size()){
str+=sta.top()+'0';
sta.pop();
}
str+=',';
}
//if(ss.size()==10)
s.insert(str);
return ;
}
if(n==-1&&a[0]==0){
fz[0]=0;
f(0,1);
}
else{
long long sum=0;
for(int j=n+1;j<10;j++){
sum=sum*10+a[j];
if(sum==0){
fz[k]=sum;
f(j,k+1);
break;
}
long long in=sqrt(sum);
if(in*in==sum){
fz[k]=sum;
f(j,k+1);
}
}
}
}
int main(){
do{
f(-1,0);
}while(next_permutation(a,a+10));
cout<<s.size();
return 0;
}
欢迎大家加入 早起学习群,一起学习一起进步!(群号: 642179511 )