凑平方数
Posted 0211ji
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了凑平方数相关的知识,希望对你有一定的参考价值。
题目:把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的。比如:0, 36, 5948721
再比如:
1098524736
1, 25, 6390784
0, 4, 289, 15376等等
注意,0可以作为独立的数字,但不能作为多位数字的开始。
分组时,必须用完所有的数字,不能重复,不能遗漏。如果不计较小组内数据的先后顺序,请问有多少种不同的分组方案?
思路:第一步0到9全排列 next_permutation(arr, arr + 10)对arr内10个元素进行全排列
第二步 对每一次的排列结果分析(也就是怎么分组),比如1, 25, 6390784 这个结果,全排列出来应该是1256390784 ,这一步就是搜索这个排列结果 可能成功的分组
1 #include<iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include<algorithm> 5 #include<map> 6 #include<set> 7 #include<string> 8 #define maxn 100010 9 using namespace std; 10 typedef long long LL; 11 int arr[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 12 long long nums[10];//用于存放平方数,最多是个单独排放 13 //set容器是一颗平衡搜索树,元素唯一且默认升序排列 14 set<string> res; 15 bool issquare(long long num) { 16 double d = sqrt(num); 17 return d == (long long)d; 18 } 19 //n表示从下标为n开始往后存在的平方数记录到nums数组内 20 void dfs(int i, int n) { 21 if (i == 10) { //i=10表示已经搜索到结束的位置 22 long long nums_t[10]; 23 copy(nums, nums + n, nums_t); 24 sort(nums_t, nums_t + n);//统一从小到大排序 25 string s; 26 for (int j = 0; j < n; ++j) { 27 s += to_string(nums_t[j]) + ‘,‘; 28 } 29 res.insert(s); 30 return; 31 } 32 33 if (arr[i] == 0) { 34 nums[n] = 0;//0单独成一组,不能成为别人的平方数 35 dfs(i + 1, n + 1); 36 return; 37 } 38 39 long long num = 0; 40 for (int j = i; j < 10; ++j) { 41 num = num * 10 + arr[j]; 42 if (issquare(num)) { 43 nums[n] = num;//记录平方数数据 44 dfs(j + 1, n + 1); 45 } 46 } 47 } 48 49 int main() { 50 do { 51 dfs(0, 0); 52 } while (next_permutation(arr, arr + 10)); 53 cout << res.size() << endl;//容器大小 54 return 0; 55 }
以上是关于凑平方数的主要内容,如果未能解决你的问题,请参考以下文章