凑平方数

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 }

 

以上是关于凑平方数的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯国赛凑平方数

天才ACM

完全平方数--力扣

标记平方数的代码不起作用,这是为啥呢?

java刷题--279完全平方数

双指针---两数平方和