标题:凑平方数
把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的。
比如:0, 36, 5948721
再比如:
1098524736
1, 25, 6390784
0, 4, 289, 15376
等等...
注意,0可以作为独立的数字,但不能作为多位数字的开始。
分组时,必须用完所有的数字,不能重复,不能遗漏。
如果不计较小组内数据的先后顺序,请问有多少种不同的分组方案?
把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的。
比如:0, 36, 5948721
再比如:
1098524736
1, 25, 6390784
0, 4, 289, 15376
等等...
注意,0可以作为独立的数字,但不能作为多位数字的开始。
分组时,必须用完所有的数字,不能重复,不能遗漏。
如果不计较小组内数据的先后顺序,请问有多少种不同的分组方案?
注意:需要提交的是一个整数,不要填写多余内容。
#include<bits/stdc++.h> using namespace std; int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; long long num[10]; set<string> s; void dfs(int step, int k) {//已经使用了step个数,凑成了k个新数 if(step == 10) { string str; long long temp[10];//另开一个数组复制已经搜完的数组再进行操作,不能直接操作搜索数组,会影响回溯 for(int i = 0; i < k; i++) temp[i] = num[i];//复制数组,两个数组要是同一类型 sort(temp, temp+k); for(int i = 0; i < k; i++) { char buff[100];//因为是存lld格式的,所以数组要开大来 sprintf(buff, "%lld", temp[i]); str += buff; str += "-"; } s.insert(str); return; } if(a[step] == 0) {//这一步走到当前数为0,直接取,0不能作为开头数,并且0也是一个平方数 num[k] = 0; dfs(step+1, k+1); }else{//保证这一数不以0开头 long long sum = 0; for(int i = step; i < 10; i++) {//遍历取多少个数 sum = sum * 10 + a[i]; double p = sqrt(sum); if(p - (int)p == 0) {//当前构成的数为平方数 num[k] = sum; dfs(i+1, k+1); } } } } int main() { do { memset(num, 0, sizeof(num)); dfs(0, 0); }while(next_permutation(a, a+10)); printf("%d\n", s.size()); return 0; }