2015年第六届蓝桥杯C/C++程序设计本科B组决赛 完美正方形
完美正方形
如果一些边长互不相同的正方形,可以恰好拼出一个更大的正方形,则称其为完美正方形。历史上,人们花了很久才找到了若干完美正方形。比如:如下边长的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三个正方形先拼到地图顶端。之后找到第一个空闲位置,深搜填入其他正方形,直到找到可以填满地图的填充方式为止。
#include <bits/stdc++.h>
using namespace std;
const int EDGE = + + ;
//大正方形边长
int num[] = {, , , , , , , , , , , , , , , , , , };
//num需要是有序的
//记录剩下的所有可以被选取的正方形边长
int vis[] = {false};
//vis[i]记录i号正方形是否被选取过
int mp[EDGE][EDGE];
//地图
void fillUp(int x, int y, int length, int fillNumber){
//填充函数,x y为要填充位置的坐标(要填充正方形的左上角所在位置)
//length为填充正方形的长度,fillNumber表示填入地图的数字(填充时设为边长,拿出时设为0)
for(int i = x; i < x + length; i++)
for(int j = y; j < y + length; j++)
mp[i][j] = fillNumber;
}
bool isFull(){ //判断地图是否已被填满
for(int i = ; i < EDGE; i++)
for(int j = ; j < EDGE; j++)
if(!mp[i][j])
return false;
return true;
}
bool judge(int x, int y, int length){ //判断位置x y是否能填入边长为length的正方形
if(x + length > EDGE || y + length > EDGE)
return false;
for(int i = x; i < x + length; i++)
for(int j = y; j < y + length; j++)
if(mp[i][j])
return false;
return true;
}
bool dfs(int x, int y){
if(isFull()) //如果地图已被填满则找到答案,返回true
return true;
if(x > EDGE || y > EDGE)
return false;
bool flag = false;
int newX, newY;
for(int i = ; i < EDGE; i++){ //将newX newY记录为地图上第一个空位的坐标
for(int j = ; j < EDGE; j++)
if(!mp[i][j]){
newX = i, newY = j;
flag = true;
break;
}
if(flag)
break;
}
for(int i = ; i < ; i++){
if(judge(newX, newY, num[i])){ //位置newX newY能填入边长为num[i]的正方形 且边长为num[i]的正方形还没有被选取过
if(!vis[i]){
fillUp(newX, newY, num[i], num[i]); //将长度为num[i]的正方形 填入位置 newX, newY
vis[i] = true; //边长为num[i]的正方形标记为已选取
if(dfs(newX, newY + num[i]))
return true;
fillUp(newX, newY, num[i], ); //将长度为num[i]的正方形从位置 newX, newY取出
vis[i] = false; //边长为num[i]的正方形标记为未选取
}
}else //由于num是有序的只要num[i]无法放入位置newX newY则之后的正方形都无法放入位置newX newY
break;
}
return false;
}
int main()
{
fillUp(, , , );
fillUp(, , , );
fillUp(, , , );
//将题中给出的上方三个正方形填入地图
dfs(, );
//int ans = 0;
for(int j = ; j < EDGE; j++)
printf("%3d ", mp[][j]); //打印最后一行
return ;
}
答案:
50 33 30 41
2015年第六届蓝桥杯C/C++程序设计本科B组决赛 完美正方形的更多相关文章
- 2015年第六届蓝桥杯C/C++程序设计本科B组决赛
1.积分之谜(枚举) 2.完美正方形 3.关联账户(并查集) 4.密文搜索 5.居民集会 6.模型染色 1.积分之迷 小明开了个网上商店,卖风铃.共有3个品牌:A,B,C.为了促销,每件商品都会返固定 ...
- 2015年第六届蓝桥杯C/C++程序设计本科B组决赛 ——居民集会(编程大题)
标题:居民集会 蓝桥村的居民都生活在一条公路的边上,公路的长度为L,每户家庭的 位置都用这户家庭到公路的起点的距离来计算,第i户家庭距起点的距 离为di.每年,蓝桥村都要举行一次集会.今年,由于村里的 ...
- 2016年第六届蓝桥杯C/C++程序设计本科B组决赛 ——一步之遥(填空题题)
一步之遥 从昏迷中醒来,小明发现自己被关在X星球的废矿车里.矿车停在平直的废弃的轨道上.他的面前是两个按钮,分别写着“F”和“B”. 小明突然记起来,这两个按钮可以控制矿车在轨道上前进和后退.按F,会 ...
- 2016年第七届蓝桥杯C/C++程序设计本科B组决赛
2.答案300 刁丝卫代码,比赛时long long写成int,结果成了263...一等擦肩而过... #include <iostream> #include <fstream&g ...
- 第七届蓝桥杯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 只 ...
- 第七届蓝桥杯C/C++程序设计本科B组决赛 ——棋子换位(代码补全题)
棋子换位 有n个棋子A,n个棋子B,在棋盘上排成一行.它们中间隔着一个空位,用“.”表示,比如: AAA.BBB 现在需要所有的A棋子和B棋子交换位置.移动棋子的规则是:1. A棋子只能往右边移动,B ...
- 第七届蓝桥杯C/C++程序设计本科B组决赛 ——凑平方数(填空题)
凑平方数 把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的.比如:0, 36, 5948721 再比如:10985247361, 25, 63907840, 4, 289, 1 ...
- 2016年第七届蓝桥杯C/C++程序设计本科B组省赛
/* 2016年第七届蓝桥杯C/C++程序设计本科B组省赛 煤球数目(结果填空) 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形) ...
- 2015年第六届蓝桥杯国赛试题(JavaA组)
1.结果填空 (满分15分)2.结果填空 (满分35分)3.代码填空 (满分31分)4.程序设计(满分41分)5.程序设计(满分75分)6.程序设计(满分103分) 1.标题:胡同门牌号 小明家住在一 ...
随机推荐
- hdu 4941 map的使用
http://acm.hdu.edu.cn/showproblem.php?pid=4941 给定N,M和K,表示在一个N*M的棋盘上有K个棋子,给出K个棋子的位置和值,然后是Q次操作,对应的是: 1 ...
- Maven的插件管理
<pluginManagement> 这个元素和<dependencyManagement>相类似,它是用来进行插件管理的. 在我们项目开发的过程中,也会频繁的引入插件,所以解 ...
- Windows 7/Vista下安装Oracle Developer Suit遇到的几个问题
http://blog.csdn.net/pan_tian/article/details/8016318 Oracle Developer Suite (ODS) 10g是在Windows 7/Vi ...
- DevExpress控件汉化教程详解
所有Developer Express .NET产品都有本地化资源,比如按钮属性,控件属性描述,菜单项,确认和错误的信息等等,所有这些资源字符串可以很容易地被翻译成各种语言. 先看下面汉化前后的图片: ...
- FastReport报表设计(仔细看)
FastReport报表设计 2011-06-16 16:56:19| 分类: 系统开发|举报|字号 订阅 下载LOFTER我的照片书 | 目录 5.1 前言 5.2 基本概念及操 ...
- 等到花儿也谢了的await
async/task/await三组合是.NET Framework 4.5带给.NET开发者的大礼,合理地使用它,可以提高应用程序的吞吐能力. 但是它的使用有点绕人,如果不正确使用,会带来意想不到的 ...
- 利用 Azure Devops 创建和发布 Nuget 包
利用 Azure Devops 创建和发布 Nuget 包 原 Visual Studio Team Service ,简称 VSTS,能够创建 pipelines 管道以构建应用程序,并将其部署到任 ...
- C++ OCCI API数据库操作之连接、返回查询结果集为json格式
使用C++操作数据库,转换返回结果集为json格式,易于解析. 以下程序的编译.运行环境:Windows 10 1803.VS2017 17.5.2(vc14).解决方案配置:Release.解决方案 ...
- .net图表之ECharts随笔07-自定义系列(多边形)
搞了一天多,才勉强搞出了一个不紧凑的六边形统计图,是真的菜. 这里ECharts的用法与06说的同一种,直接使用带all的js 先上个效果图,用面积来表示人数的多少 1. 参数option的toolt ...
- python 字符串中‘r’前缀
在Python中,如果字符串的前面有r/R前缀,那么,就会禁用转义符\的功能: >>>path = r'C:\new\text.dat'>>>pah'C:\\new ...