题目:
凑平方数
把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的。
比如:0, 36, 5948721
再比如:
1098524736
1, 25, 6390784
0, 4, 289, 15376
等等...
注意,0可以作为独立的数字,但不能作为多位数字的开始。
分组时,必须用完所有的数字,不能重复,不能遗漏。
如果不计较小组内数据的先后顺序,请问有多少种不同的分组方案?
注意:需要提交的是一个整数,不要填写多余内容。
代码
<仅供参考>
#include <bits/stdc++.h>
using namespace std;
int arr[10] = {0,1,2,3,4,5,6,7,8,9};
long long nums[10];
set<string> sset;
bool issqr(long long num)
{
double tmp = sqrt(num);
return tmp == (long long) tmp;
}
string to_string(long long num)
{
ostringstream ostr;
ostr << num;
return ostr.str();
}
void dfs(int i, int n)
{
if(i==10) {
long long nums_t[10];
copy(nums,nums+n,nums_t);
sort(nums_t,nums_t+n);
string str;
for(int j=0; j<n; ++j) {
str += to_string(nums_t[j]) + ",";
}
sset.insert(str);
return ;
}
if(arr[i]==0) {
nums[n] = 0;
dfs(i+1,n+1);
return;
}
long long num = 0;
for(int j=i; j<10; ++j) {
num = num*10 + arr[j];
if(issqr(num)) {
nums[n] = num;
dfs(j+1,n+1);
}
}
}
int main()
{
memset(nums, 0, sizeof(int)*10);
do {
dfs(0,0);
}while(next_permutation(arr,arr+10));
cout << sset.size();
return 0;
}