完美正方形

  如果一些边长互不相同的正方形,可以恰好拼出一个更大的正方形,则称其为完美正方形。历史上,人们花了很久才找到了若干完美正方形。比如:如下边长的22个正方形

2 3 4 6 7 8 12 13 14 15 16 17 18 21 22 23 24 26 27 28 50 60

如【图1.png】那样组合,就是一种解法。


  此时,紧贴上边沿的是:60 50,紧贴下边沿的是:26 28 17 21 18

  22阶完美正方形一共有8种。下面的组合是另一种:

2 5 9 11 16 17 19 21 22 24 26 30 31 33 35
36 41 46 47 50 52 61

  如果告诉你该方案紧贴着上边沿的是从左到右依次为:47 46 61,你能计算出紧贴着下边沿的是哪几个正方形吗?

  请提交紧贴着下边沿的正方形的边长,从左到右,用空格分开。

不要填写任何多余的内容或说明文字。

解题思路:

  既然已经给出紧贴着上边沿的三个正方形,便可以得知最终拼接成的大正方形边长为47+46+61=154我们将整个大正方形视为一个154*154的地图,将47 46 61三个正方形先拼到地图顶端。之后找到第一个空闲位置,深搜填入其他正方形,直到找到可以填满地图的填充方式为止。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int EDGE = + + ;
  4. //大正方形边长
  5. int num[] = {, , , , , , , , , , , , , , , , , , };
  6. //num需要是有序的
  7. //记录剩下的所有可以被选取的正方形边长
  8. int vis[] = {false};
  9. //vis[i]记录i号正方形是否被选取过
  10. int mp[EDGE][EDGE];
  11. //地图
  12. void fillUp(int x, int y, int length, int fillNumber){
  13. //填充函数,x y为要填充位置的坐标(要填充正方形的左上角所在位置)
  14. //length为填充正方形的长度,fillNumber表示填入地图的数字(填充时设为边长,拿出时设为0)
  15. for(int i = x; i < x + length; i++)
  16. for(int j = y; j < y + length; j++)
  17. mp[i][j] = fillNumber;
  18. }
  19. bool isFull(){ //判断地图是否已被填满
  20. for(int i = ; i < EDGE; i++)
  21. for(int j = ; j < EDGE; j++)
  22. if(!mp[i][j])
  23. return false;
  24. return true;
  25. }
  26. bool judge(int x, int y, int length){ //判断位置x y是否能填入边长为length的正方形
  27. if(x + length > EDGE || y + length > EDGE)
  28. return false;
  29. for(int i = x; i < x + length; i++)
  30. for(int j = y; j < y + length; j++)
  31. if(mp[i][j])
  32. return false;
  33. return true;
  34. }
  35. bool dfs(int x, int y){
  36. if(isFull()) //如果地图已被填满则找到答案,返回true
  37. return true;
  38. if(x > EDGE || y > EDGE)
  39. return false;
  40. bool flag = false;
  41. int newX, newY;
  42. for(int i = ; i < EDGE; i++){ //将newX newY记录为地图上第一个空位的坐标
  43. for(int j = ; j < EDGE; j++)
  44. if(!mp[i][j]){
  45. newX = i, newY = j;
  46. flag = true;
  47. break;
  48. }
  49. if(flag)
  50. break;
  51. }
  52. for(int i = ; i < ; i++){
  53. if(judge(newX, newY, num[i])){ //位置newX newY能填入边长为num[i]的正方形 且边长为num[i]的正方形还没有被选取过
  54. if(!vis[i]){
  55. fillUp(newX, newY, num[i], num[i]); //将长度为num[i]的正方形 填入位置 newX, newY
  56. vis[i] = true; //边长为num[i]的正方形标记为已选取
  57. if(dfs(newX, newY + num[i]))
  58. return true;
  59. fillUp(newX, newY, num[i], ); //将长度为num[i]的正方形从位置 newX, newY取出
  60. vis[i] = false; //边长为num[i]的正方形标记为未选取
  61. }
  62. }else //由于num是有序的只要num[i]无法放入位置newX newY则之后的正方形都无法放入位置newX newY
  63. break;
  64. }
  65. return false;
  66. }
  67. int main()
  68. {
  69. fillUp(, , , );
  70. fillUp(, , , );
  71. fillUp(, , , );
  72. //将题中给出的上方三个正方形填入地图
  73. dfs(, );
  74. //int ans = 0;
  75. for(int j = ; j < EDGE; j++)
  76. printf("%3d ", mp[][j]); //打印最后一行
  77. return ;
  78. }

答案:

50 33 30 41

2015年第六届蓝桥杯C/C++程序设计本科B组决赛 完美正方形的更多相关文章

  1. 2015年第六届蓝桥杯C/C++程序设计本科B组决赛

    1.积分之谜(枚举) 2.完美正方形 3.关联账户(并查集) 4.密文搜索 5.居民集会 6.模型染色 1.积分之迷 小明开了个网上商店,卖风铃.共有3个品牌:A,B,C.为了促销,每件商品都会返固定 ...

  2. 2015年第六届蓝桥杯C/C++程序设计本科B组决赛 ——居民集会(编程大题)

    标题:居民集会 蓝桥村的居民都生活在一条公路的边上,公路的长度为L,每户家庭的 位置都用这户家庭到公路的起点的距离来计算,第i户家庭距起点的距 离为di.每年,蓝桥村都要举行一次集会.今年,由于村里的 ...

  3. 2016年第六届蓝桥杯C/C++程序设计本科B组决赛 ——一步之遥(填空题题)

    一步之遥 从昏迷中醒来,小明发现自己被关在X星球的废矿车里.矿车停在平直的废弃的轨道上.他的面前是两个按钮,分别写着“F”和“B”. 小明突然记起来,这两个按钮可以控制矿车在轨道上前进和后退.按F,会 ...

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

    2.答案300 刁丝卫代码,比赛时long long写成int,结果成了263...一等擦肩而过... #include <iostream> #include <fstream&g ...

  5. 第七届蓝桥杯C/C++程序设计本科B组决赛 ——机器人塔(程序大题)

    机器人塔 X星球的机器人表演拉拉队有两种服装,A和B.他们这次表演的是搭机器人塔. 类似: A B B A B A A A B B B B B A BA B A B B A 队内的组塔规则是: A 只 ...

  6. 第七届蓝桥杯C/C++程序设计本科B组决赛 ——棋子换位(代码补全题)

    棋子换位 有n个棋子A,n个棋子B,在棋盘上排成一行.它们中间隔着一个空位,用“.”表示,比如: AAA.BBB 现在需要所有的A棋子和B棋子交换位置.移动棋子的规则是:1. A棋子只能往右边移动,B ...

  7. 第七届蓝桥杯C/C++程序设计本科B组决赛 ——凑平方数(填空题)

    凑平方数 把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的.比如:0, 36, 5948721 再比如:10985247361, 25, 63907840, 4, 289, 1 ...

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

    /* 2016年第七届蓝桥杯C/C++程序设计本科B组省赛 煤球数目(结果填空) 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形) ...

  9. 2015年第六届蓝桥杯国赛试题(JavaA组)

    1.结果填空 (满分15分)2.结果填空 (满分35分)3.代码填空 (满分31分)4.程序设计(满分41分)5.程序设计(满分75分)6.程序设计(满分103分) 1.标题:胡同门牌号 小明家住在一 ...

随机推荐

  1. Beta阶段第二篇Scrum冲刺博客-Day1

    1.站立式会议 提供当天站立式会议照片一张 2.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 张晨晨:交接进组 郭琪容:明确任务并学习 吴玲:明确接 ...

  2. 5、Makefile基础知识汇总(转自陈皓总述)

    一.Makefile里有什么? Makefile里主要包含了五个东西:显式规则.隐晦规则.变量定义.文件指示和注释. 1.显式规则.显式规则说明了,如何生成一个或多的的目标文件.这是由Makefile ...

  3. springMVC:HandlerInterceptor拦截器的使用

    1.使用背景 Web项目中需要判断http接口用户Post上来的数据是否合法,如果不合法要另做处理,用户Post上来的数据是Json形式的,我们用了@RequestBody标记自动将json形式的提交 ...

  4. 第一天:html+JavaScript函数

    testjstry1.html   知识点1:求多组数据的和 function demo(a,b){ var sum=a+b; return sum;}var v1=demo(20,10);var v ...

  5. Windows核心编程:第3章 内核对象

    Github https://github.com/gongluck/Windows-Core-Program.git //第3章 内核对象.cpp: 定义应用程序的入口点. // #include ...

  6. C# 两个datatable中的数据快速比较返回交集或差集

    转自: https://www.cnblogs.com/lacey/p/5893380.html 如果两个datatable的字段完全一致的话,可以直接使用Except,Intersect //Exc ...

  7. C# .NET 根据Url链接保存Image图片到本地磁盘

    根据一个Image的Url链接可以在浏览器中显示一个图片,如果要通过代码将图片保存在本地磁盘可以通过以下方式: 1.首先获取图片的二进制数组. static public byte[] GetByte ...

  8. 记录一次错误处理 (xml序列化和反序列化相关)

    XML序列化后,反序列化时出现错误 报错现象 System.InvalidOperationException: XML 文档(40, 11)中有错误. ---> System.Xml.XmlE ...

  9. sharepoint support ashx file

    Hello, I did the steps from the tutorial you are using. I have received the same error when I did no ...

  10. execution表达式--小坑

    之前使用的都是eclipse,今天开始复习spring了,开始接触IDEA,在复习过程中,出了点小事, 复习到AOP开发时,有半自动和全自动之说,之前我看那期视频里面没讲过全自动,我就自己再那敲Dem ...