2016年第七届蓝桥杯【C++决赛赛B组】【第二题:凑平方数】——全排列+暴力DFS

16人阅读 评论(0) 收藏 举报
分类:
标题:凑平方数


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


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


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


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


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


#include<bits/stdc++.h>
using namespace std;
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
long long num[10];
set<string> s;
void dfs(int step, int k) {//已经使用了step个数,凑成了k个新数
  if(step == 10) {
    string str;
    long long temp[10];//另开一个数组复制已经搜完的数组再进行操作,不能直接操作搜索数组,会影响回溯 
    for(int i = 0; i < k; i++)
      temp[i] = num[i];//复制数组,两个数组要是同一类型 
    sort(temp, temp+k);
    for(int i = 0; i < k; i++) {
      char buff[100];//因为是存lld格式的,所以数组要开大来 
      sprintf(buff, "%lld", temp[i]);
      str += buff;
      str += "-";
    }
    s.insert(str);
    return;
  }
  if(a[step] == 0) {//这一步走到当前数为0,直接取,0不能作为开头数,并且0也是一个平方数
    num[k] = 0;
    dfs(step+1, k+1); 
  }else{//保证这一数不以0开头
    long long sum = 0;
    for(int i = step; i < 10; i++) {//遍历取多少个数
      sum = sum * 10 + a[i];
      double p = sqrt(sum);
      if(p - (int)p == 0) {//当前构成的数为平方数 
        num[k] = sum;
        dfs(i+1, k+1);
      } 
    } 
  }
}
int main() {
  do {
    memset(num, 0, sizeof(num));
    dfs(0, 0);
  }while(next_permutation(a, a+10));
  printf("%d\n", s.size());
  return 0;
}

查看评论

C++基础

-
  • 1970年01月01日 08:00

LeetCode 633:平方数之和(C++实现)

题目:给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c。思路:使用双指针法,最小为0,最大为输入数的平方根,判断当前两个指针是否满足要求。示例1:输入: 5 ...
  • qq_36766560
  • qq_36766560
  • 2018-03-30 19:46:31
  • 73

2016 蓝桥杯 国赛 JAVA A组第二题 凑平方数

刚拿到这题,没有思路。明明知道是递归回溯,却搞不清很多细节,直到找到一篇博文。。 感谢原博主的分享,学到了很多东西 原博请见:http://blog.csdn.net/sunshine_java_l/...
  • wang_cc_
  • wang_cc_
  • 2017-08-02 14:21:00
  • 455

2016年蓝桥杯决赛第二题凑平方数

刚刚搞完蓝桥杯,题目比以往要难得多第二题就花了很多时间不过没有做出来,事后仔细琢磨了一下终于想出来了怎么做 题目的意思大致是这样的 0~9这是个数字进行分组得到若干组合这些组合中有一些 每一组数据都可...
  • nuclear_physis
  • nuclear_physis
  • 2016-06-02 17:06:41
  • 140

2016第七届蓝桥杯C/C++ B组省赛第三题:凑算式

/*凑算式       B      DEF A +   — +  ——— = 10       C      GHI (如果显示有问题,可以参见【图1.jpg】) ...
  • zhenzhen95
  • zhenzhen95
  • 2016-03-29 12:21:34
  • 2639

2016第七届蓝桥杯国赛决赛c/c++本科B组试题总结及解题答案

1.一步之遥 从昏迷中醒来,小明发现自己被关在X星球的废矿车里。 矿车停在平直的废弃的轨道上。 他的面前是两个按钮,分别写着“F”和“B”。 小明突然记起来,这两个按钮可以控制矿车在轨道上前进和...
  • winter2121
  • winter2121
  • 2017-05-20 02:14:04
  • 4133

2016年第七届蓝桥杯c/c++省赛B组

2016年第七届蓝桥杯c/c++省赛B组 煤球数目 生日蜡烛 凑算式 快速排序 抽签 方格填数 剪邮票 四平方和 交换瓶子 最大比例...
  • star92014
  • star92014
  • 2016-03-21 09:00:51
  • 9398

2016年第七届蓝桥杯C/C++程序设计本科B组省赛

1.煤球数目 2.生日蜡烛 3.凑算式 4.快速排序 5.抽签 6.方格填数 7.剪邮票 8.四平方和 9.交换瓶子 10.最大比例...
  • u014552756
  • u014552756
  • 2016-03-21 14:41:42
  • 10060

2016年蓝桥杯第七届javaB组真题及答案

煤球数目 有一堆煤球,堆成三角棱锥形。具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), ...
  • sihai12345
  • sihai12345
  • 2017-04-04 22:17:00
  • 4375

蓝桥杯 第七届省赛试题 方格填数

package com.diqijie.shengsai; /** * @author leibaobao *方格填数 *解:没想太多,全排列能做的,加几个判断就好。想多了浪费时间 */ p...
  • u013993712
  • u013993712
  • 2016-04-08 21:01:57
  • 439
    个人资料
    等级:
    访问量: 313
    积分: 96
    排名: 141万+
    文章分类
    文章存档
    最新评论