【蓝桥杯】第七届国赛C语言B组 2.凑平方数(dfs+STL)

把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的。
比如:0, 36, 5948721

再比如:
1098524736
1, 25, 6390784
0, 4, 289, 15376
等等...

注意,0可以作为独立的数字,但不能作为多位数字的开始。
分组时,必须用完所有的数字,不能重复,不能遗漏。

如果不计较小组内数据的先后顺序,请问有多少种不同的分组方案?

注意:需要提交的是一个整数,不要填写多余内容。

仍然没什么思路   很久没写代码 真的都退化了

代码来源:https://blog.csdn.net/riba2534/article/details/72480145

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 
 4 using namespace std;
 5 
 6 int a[10] = {0,1,2,3,4,5,6,7,8,9};
 7 ll n1[10];
 8 set<string>s;
 9 
10 void dfs(int step,int num)
11 {
12     if(step == 10)   // 用完了10个数
13     {
14         ll n2[10];
15         for(int i = 0;i < num;i++)
16         {
17              n2[i] = n1[i];
18         }
19         sort(n2,n2+num);
20         string xu;
21         char str[100];
22         for(int i = 0;i < num;i++)
23         {
24             sprintf(str,"%lld",n2[i]);   // 转换成字符串
25             xu += str;
26             xu += "-";
27         }
28         cout << xu << endl;
29         s.insert(xu);   
30         return ;
31     }
32     if(a[step] == 0)
33     {
34         n1[num] = 0;
35         dfs(step+1,num+1);
36     }
37     else
38     {
39         ll sum  = 0;
40         for(int i = step;i < 10;i++)
41         {
42             sum = sum*10+a[i];   // 算出当前所得到的值
43             double son = sqrt(sum);
44             if(son == (int)son)
45             {
46                 n1[num] = sum;
47                 dfs(i+1,num+1);
48             }
49         }
50     }
51 }
52 
53 int main()
54 {
55     do
56     {
57         memset(n1,0,sizeof(n1));
58         dfs(0,0);
59     }
60     while(next_permutation(a,a+10));
61     cout << s.size() << endl;
62     return 0;
63 }
文章搬运自我的个人博客http://duny31030.top 原博客为静态博客,因备份丢失无法继续更新,所以又搬运回博客园,可能部分文章阅读体验不好,可以到我的静态博客搜索相同标题查看
原文地址:https://www.cnblogs.com/duny31030/p/9071537.html