对每组数据输出一行"yes"或"no",表示能否用全部积木拼成一个正方形.

解题思路:

鉴于积木的个数不多,可以采用深度优先的方式进行搜索;

首先,要组成的大正方形的表示:采用一维数组cols[41]来表示,其中cols[i]表示第i列中已占用的行的行号加1,即可用的第一行行号。为什么为41,是因为要组成的正方形可能的最大边长41,而我们让下标从1开始。

然后,输入的积木的边的保存:还是采用一维数组side[11],其中side[i]表示边长为i的边的数目,这里的11同上,也是由于最大为10,而我们从side[1]开始。

搜索的策略,很容易想到可以从矩阵的左上角开始填,每次按列从左边向右填,左边的填完了才能天右边的,显然这样是正确的。

优化与剪枝,首先,所有小蛋糕的面积和不等于要拼的正方形的面积,则没必要填。可以每次按正方形从大到小开始填,如果该大小的正方形填不进去,则其他相同大小的正方形就没有必要所了,回溯后,原先大小的正方形也没必要填,因为正方形最大是10,所以从10开始选,一直递减,看有没有该大小的正方形,能不能放入,如果放不下则选择比其小的正方形即可,否则,该正方形的数目减一,修改该矩形,搜索下一个正方形,如果该拼法行不通,则回溯。

C++代码如下:

#include

#include

using namespace std;

int

s; //s,表示要组成的正方形的边长

int

n; //n(1<=n<=16),表示积木的个数

int

side[11]; //side[i]用来保存边长为i的小正方形的个数,这里约定正方形的边长最大为10

int

cols[41]; //cols[i]表示第i列已经被占用的行数+1,即最小可用行起始

vector result;

int backTrace(int a)

{

int selectCol, minRow, i, j, flag;

if (a == n) return 1;

minRow = 41;

for (i = 1; i <= s; ++i)

if (cols[i] <

minRow)

{

selectCol =

i;

minRow =

cols[i];

}

for (i = 10; i > 0; --i)

{

if (side[i]

&& selectCol-1+i <=

s && minRow-1+i <=

s)

{

flag =

1;

for (j =

selectCol; j < selectCol + i; ++j)

if

(cols[j] > minRow)

{

flag

= 0;

break;

}

if

(flag)

{

for

(j = selectCol; j < selectCol + i; ++j) cols[j] +=

i;

side[i]--;

if

(backTrace(a + 1)) return 1;

else

{

for

(j = selectCol; j < selectCol + i; ++j) cols[j] -=

i;

side[i]++;

}

}

}

}

return 0;

}

int main()

{

int cases = 0;

int i, temp;

cin>>cases;

int area;

while (cases > 0)

{

cases--;

cin>>s>>n;

memset(side, 0,

sizeof(side));

area = 0;

for (i = 0; i <

n; ++i)

{

cin>>temp;

side[temp]++;

area += temp

* temp;

}

if (area != s * s)

result.push_back(0);

else

{

for (i = 1; i

<= 40; ++i) cols[i] = 1;

int rr =

backTrace(0);

result.push_back(rr);

}

}

for (i = 0; i < result.size();

++i)

if (result[i])

cout<

else

cout<

return 0;

}

c语言side输出空心正方形,回溯法--正方形(蛋糕切分)问题相关推荐

  1. 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 回溯法

    <数据结构.算法与应用 -- C++语言描述>学习笔记 - 回溯法 一.算法思想 二.货箱装载 1.问题描述 2.回溯算法 3.实现 4.测试代码 一.算法思想 回溯法是搜索问题解的一种系 ...

  2. 第39级台阶回溯算法c语言,五大经典算法之回溯法 - osc_9ipdey7e的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.基本概念 回溯法,又称为试探法,按选优条件向前不断搜索,以达到目标.但是当探索到某一步时,如果发现原先选择并不优或达不到目标,就会退回一步重新选择,这种达不到目的就退回再走的算法称为回溯法. 与穷 ...

  3. c语言最短加法链问题回溯法,《回溯法习题》PPT课件.ppt

    1,课程安排,第5章 回溯法习题课,3,第5章 回溯法习题,子集和问题 最小长度电路板排列问题 最小重量机器设计问题 运动员最佳匹配问题 无分隔符字典问题 无和集问题 n色方柱问题 整数变换问题 拉丁 ...

  4. c语言打印空心矩形图案的程序,C语言之输出空心棱形图案

    #include #include void main() { int n,j,i; /*i为行数,j为每行中的项数*/ printf("输入图案上三角的高度n:"); scanf ...

  5. c语言side输出空心正方形,请帮忙完成这个c#语言打印正方形的程序

    程序: using System; using System.Collections.Generic; using System.Text; namespace c { class Point { p ...

  6. c语言实现全排列并存储,C语言实现全排列和回溯法总结

    一.递归实现全排列 #include"cstdio" int A[]; void print_permutation(int n,int *A,int cur){ if(cur== ...

  7. C语言回溯法九宫格数独问题

    Problem H 数独游戏 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 数独游戏规则 在9阶方阵中,包含了81个小格(九列九行),其中又再分成九个小正方形(称为宫),每 ...

  8. 回溯法(八皇后问题)及C语言实现

    回溯法,又被称为"试探法".解决问题时,每进行一步,都是抱着试试看的态度,如果发现当前选择并不是最好的,或者这么走下去肯定达不到目标,立刻做回退操作重新选择.这种走不通就回退再走的 ...

  9. 【C语言练习——打印空心正方形及其变形】

    活动地址:毕业季·进击的技术er 夏日炎炎,热浪中我们迎来毕业季,这是告别,也是迈向新起点的开始.这是一个毕业的月份,每年看到很多毕业生都离校上班,在校生准备考试和暑假实习,都非常感慨,不管怎样,作为 ...

  10. 重写0-1背包问题的回溯法,使算法能输出最优解

    重写0-1背包问题的回溯法,使算法能输出最优解 样例: 4 7 3 9 5 10 2 7 1 4 输出: 20 分析:构建二叉树,每个物品只有拿和不拿两种情况, 时间复杂度为O(2^n). 不难, 深 ...

最新文章

  1. 单精度和半精度混合训练
  2. Java项目:星际争霸游戏(java+swing+awt界面编程+IO输入输出流+socket+udp网络通信)
  3. 【Lolttery】项目开发日志 (五)目标dubbox,前进
  4. Linux下的主辅DNS服务器同步
  5. shell脚本详解(十二)——Here Document免交互及Expect自动化交互
  6. GMQ集团推出全球创新型金融衍生品交易平台
  7. Hadoop学习笔记03_Hive练习
  8. SAP Spartacus使用到的技术栈
  9. Dataloader与Dataset
  10. c++调用python找不到py文件的可能原因
  11. 利用Pattern和Mather来禁止特殊字符的输入
  12. easyexcel多个sheet导入_Easypoi实现excel多sheet表导入导出功能
  13. 聚类算法实践——PCCA、SOM、Affinity Propagation
  14. 非常详细的Maven安装与配置教程
  15. Java应用分层(阿里巴巴Java开发手册)
  16. Greenplum字段拼接
  17. 一个宽带猫能不能连接两个路由器?
  18. 离线安装VS2019教程
  19. 详细介绍@GetMapping和@PostMapping的区别
  20. 苹果xr十大隐藏功能_苹果iPhone12Pro隐藏功能!简单3步骤“量身高”

热门文章

  1. 【优化算法】杂草优化算法(IWO)【含Matlab源码 1076期】
  2. 【图像压缩】基于matlab GUI小波变换图像压缩【含Matlab源码 609期】
  3. 【语音隐写】基于matlab小波变换算法求解水印嵌入提取【含Matlab源码 513期】
  4. 【TWVRP】基于matlab遗传算法和模拟退火求解带时间窗自行车调度问题【含Matlab源码 370期】
  5. acl自然语言处理_ACL 2020中自然语言处理中的知识图
  6. 自我监督学习和无监督学习_弱和自我监督的学习-第3部分
  7. python向mysql插入数据
  8. Web服务器用户权限设置,Windows系统下WEB服务器权限的设置详解(四)
  9. html word 打开,HTML以Word或Excel打开
  10. python 多进程 阻塞_Python Pool类多进程 apply_async 异步变成了阻塞解决方法