zoukankan      html  css  js  c++  java
  • 第七届蓝桥杯国赛 凑平方数(dfs+set去重)

    【题目】

    凑平方数 
    把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够 
    办到的。
    
    比如:0, 36, 5948721
    
    再比如: 
    1098524736 
    1, 25, 6390784 
    0, 4, 289, 15376 
    等等…
    
    注意,0可以作为独立的数字,但不能作为多位数字的开始。 
    分组时,必须用完所有的数字,不能重复,不能遗漏。
    
    如果不计较小组内数据的先后顺序,请问有多少种不同的分组方案?
    
    注意:需要提交的是一个整数,不要填写多余内容。
    

    【分析】

    首先利用全全排列函数列举出所有的组合,然后利用dfs搜索每一个满足的组合,在查找的过程中利用排序+set容器来去重复(这是一种较为常见的去重方法,注意要排序),dfs过程中,要判断一个数是否为平方数,还要对特殊的情况进行特判。
    【知识点】

    全排列,dfs,平方数判断,set去重

    【代码】

    #include <bits/stdc++.h>
    using namespace std;
    int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    long long nums[10];
    set<string> res;
    
    //判断一个是否为平方数
    bool isqnum(long long num){
        double d = sqrt(num);
        return d == (long long)d;
    }
    
    //从arr:[i, n)寻找平方数
    void dfs(int i, int n){
        if(i == 10){
            long long nums_t[10];
            copy(nums, nums + n, nums_t);
            sort(nums_t, nums_t + n);
            string s;
            long long int ju = 0;
            for(int j = 0; j < n; ++ j){
                string te = "";
                stringstream stream;
                stream << nums_t[j];
                stream >> te;
                s += te + ",";
            }
            cout << s << endl;
            res.insert(s);
            return ;
        }
    
        if(arr[i] == 0){  //特判a[i] == 0 也是平方数;
            nums[n] = 0;
            dfs(i + 1, n + 1);
            return;
        }
    
        long long num = 0;
        for(int j = i; j < 10; ++ j){
            num = num*10 + arr[j];
            if(isqnum(num)){
                nums[n] = num;
                dfs(j + 1, n + 1);
            }
        }
    }
    
    int main(){
        do{
            dfs(0, 0);
        }while(next_permutation(arr, arr + 10));
        cout << res.size()  << endl;
        return 0;
    }

    //(代码参考:https://blog.csdn.net/luoluozlb/article/details/72581286,但是原来的to_string函数用不了,所以用上了stream函数);

    【补充】
    stream函数是c++中重要的一个函数,有关输入流,输出流,字符串流等,再转换整型与字符串之间起着重要的作用。这里是学习链接:stream (什么时候,我回头记起来了,再来写一篇关于stream的)。


    【记录心情】
    5月25号就是蓝桥杯国赛了,虽然蓝桥杯的含金量跟ACM赛事是没法比的,但是还是希望自己能拿到国2以上的成绩,因为好像已经没有机会再去打ACM类的比赛了。。。

  • 相关阅读:
    cf Inverse the Problem (最小生成树+DFS)
    cf Make It Nondeterministic (简单贪心)
    cf Learn from Life (简单贪心)
    hdu 5057 Argestes and Sequence (数状数组+离线处理)
    hdu 5056 Boring count (类似单调队列的做法。。)
    hdu 5055 Bob and math problem (很简单贪心)
    三样东西能让女人幸福一生
    第01课 OpenGL窗口(4)
    爱情要不要吃回头草?(林忆)
    第01课 OpenGL窗口(3)
  • 原文地址:https://www.cnblogs.com/myxdashuaige/p/10665670.html
Copyright © 2011-2022 走看看