完美正方形

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

2 using namespacestd;3 const int EDGE = 47 + 46 + 61;4 //大正方形边长

5 int num[] = {2, 5, 9, 11, 16, 17, 19, 21, 22, 24, 26, 30, 31, 33, 35, 36, 41, 50, 52};6 //num需要是有序的7 //记录剩下的所有可以被选取的正方形边长

8 int vis[20] = {false};9 //vis[i]记录i号正方形是否被选取过

10 intmp[EDGE][EDGE];11 //地图

12 void fillUp(int x, int y, int length, intfillNumber){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 = 0; i < EDGE; i++)21 for(int j = 0; 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, inty){36 if(isFull()) //如果地图已被填满则找到答案,返回true

37 return true;38 if(x > EDGE || y >EDGE)39 return false;40 bool flag = false;41 intnewX, newY;42 for(int i = 0; i < EDGE; i++){ //将newX newY记录为地图上第一个空位的坐标

43 for(int j = 0; 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 = 0; i < 19; 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], 0); //将长度为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 intmain()68 {69 fillUp(0, 0, 47, 47);70 fillUp(0, 47, 46, 46);71 fillUp(0, 93, 61, 61);72 //将题中给出的上方三个正方形填入地图

73 dfs(0, 0);74 //int ans = 0;

75 for(int j = 0; j < EDGE; j++)76 printf("%3d", mp[153][j]); //打印最后一行

77 return 0;78 }

答案:

50 33 30 41

c语言程序设计正方体,2015年第六届蓝桥杯C/C++程序设计本科B组决赛 完美正方形...相关推荐

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

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

  2. 2015年第六届蓝桥杯C/C++程序设计本科B组省赛 星系炸弹(日期推算)

    星系炸弹 在X星系的广袤空间中漂浮着许多X星人造"炸弹",用来作为宇宙中的路标. 每个炸弹都可以设定多少天之后爆炸. 比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2 ...

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

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

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

    http://www.docin.com/p-506195687.html 这样算不算写了一道题.... 完美正方形 如果一些边长互不相同的正方形,可以恰好拼出一个更大的正方形,则称其为完美正方形. ...

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

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

  6. 2015年第六届蓝桥杯 - 省赛 - Java大学B组 - A. 三角形面积

    三角形面积 如[图1]所示.图中的所有小方格面积都是1. 那么,图中的三角形面积应该是多少呢? 请填写三角形的面积.不要填写任何多余内容或说明性文字. Ideas 这道题跟2018年第九届蓝桥杯 - ...

  7. 2015年第六届蓝桥杯 - 省赛 - Java大学A组 - A. 熊怪吃核桃

    熊怪吃核桃 森林里有一只熊怪,很爱吃核桃. 不过它有个习惯,每次都把找到的核桃分成相等的两份,吃掉一份,留一份. 如果不能等分,熊怪就会扔掉一个核桃再分. 第二天再继续这个过程,直到最后剩一个核桃了, ...

  8. 第六届蓝桥杯软件类c/c++B组决赛

    标题:积分之迷 小明开了个网上商店,卖风铃.共有3个品牌:A,B,C. 为了促销,每件商品都会返固定的积分. 小明开业第一天收到了三笔订单: 第一笔:3个A + 7个B + 1个C,共返积分:315 ...

  9. 2015年第六届蓝桥杯C/C++B组省赛题目解析

    1.奖券数目 有些人很迷信数字,比如带"4"的数字,认为和"死"谐音,就觉得不吉利. 虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求.某抽奖活动的奖券号码是 ...

最新文章

  1. 那些年困扰 Linux 的蠕虫、病毒和木马
  2. React-生命周期杂记
  3. Linux C编程--操作文件结束和错误的判断方法(函数)
  4. 35天 GRE: V160+Q168+W3.5
  5. 计算机更改家庭组密码,Win10系统怎么修改家庭组密码 win10修改家庭组密码的方法...
  6. python中打印zip()函数结果和zip()函数的使用
  7. 树-二叉树、满二叉树和完全二叉树
  8. RuntimeError: size mismatch, m1: [80 x 4], m2: [320 x 50] at ..\aten\src\TH/generic/THTensorMath.cpp
  9. 一键解决 500、502和504 Internal Privoxy Error 问题(图文详解)
  10. mysql openfileslimit 设置_mysql open_files_limit值更改无效
  11. Linux操作系统教学进度计划表
  12. js 函数传参改变div属性
  13. pytorch 使用netron可视化
  14. numpy的choose 函数实现条件筛选
  15. 2016年全球超级计算机榜首是,中国神威·太湖之光荣登全球超级计算机500强榜首...
  16. Java反射之Filed(类中的属性对象)
  17. 计算机论文的参考文献,应该怎么引用? - 易智编译EaseEditing
  18. 分组交换网中的时延详解
  19. Failed to load API definition
  20. 个人简历html网页代码(使用chatgpt完成web开发课的实验)

热门文章

  1. excel自动换行_你会用Excel制作流程图吗?
  2. ai插画会代替人工插画师吗,人工插画师的职业规划怎么做。插画能流行多久...
  3. @click和@click.native
  4. Snipaste截图工具调整线条粗细快捷键
  5. 抖音SEO,抖音seo源码,抖音seo矩阵,抖音seo独立部署
  6. 2021年山东省安全员C证考试题及山东省安全员C证考试资料
  7. 线性布局下,如何最左或者最右
  8. c 和python先学哪个好_汕头市北大青鸟的地址是
  9. html动画效果停顿几秒,css3 animation动画执行结束,停顿几秒后重新开始执行
  10. pl\sql直接不使用update语句修改数据