zoukankan      html  css  js  c++  java
  • 凑平方数

    题目:把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 }
  • 相关阅读:
    sql-lib闯关秘籍之1-10关
    简单的SQL注入
    五分钟带你读懂 TCP全连接队列(图文并茂)
    Ambari HDP集群搭建全攻略
    Spring Cloud Security OAuth2.0 认证授权系列(入门篇)
    敲黑板:InnoDB的Double Write,你必须知道
    重要,知识点:InnoDB的插入缓冲
    你不知道的内存知识
    每日一个知识点:关于磁盘的一些事儿
    Spring Boot 系列:日志动态配置详解
  • 原文地址:https://www.cnblogs.com/0211ji/p/13276941.html
Copyright © 2011-2022 走看看