热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

矩形排版问题求教海星大哥

我想编一个程序,实际工作中要用的,指定一个大矩形和一个小矩形,要求给出将大矩形分割成小矩形的最佳排版方式,要求能纵横混排。本人刚开始自学编程,没学过算法课程,请详细指教,最好有代码有朋友说
我想编一个程序,实际工作中要用的,指定一个大矩形和一个小矩形,要求给出将大矩形分割成小矩形的最佳排版方式,要求能纵横混排。
本人刚开始自学编程,没学过算法课程,请详细指教,最好有代码

有朋友说你曾经讲过,但我没找到这个帖子,麻烦您再给指点一下,谢谢!

1 个解决方案

#1


m*n的棋盘的p*q矩形完全覆盖的充要条件

先用数学语言定义几个概念:

m*n的棋盘是指由m行n列方格构成的棋盘。
所谓棋盘的覆盖,是指用若干个相同的图形去覆盖m*n的棋盘,覆盖棋盘的每个图形也由若干个方格组成,称之为覆盖形。在棋盘的覆盖中,约定任意两个覆盖形互不相重叠,且任意一个覆盖形的任何一个方格与棋盘的某个方格重合。

下面先研究简单的情况,当p=1,q=k的情况。

定理一:
m*n的棋盘存在1*k矩形的完全覆盖的充要条件是k|m或者k|n。  (其中a|b表示a整除b)

证:充分性显然。下面证明必要性。
假设m*n的棋盘存在1*k矩形的完全覆盖。在m*n棋盘的各个格中填数:第一列的格从上至下依次填1,2,..m,此外,对于其中的任何一行,所填的各数从左至右构成公差为1的等差数列。这样,每一个1*k矩形在棋盘的覆盖中所盖住的格所填的数字恰好构成模k的一个完系(如果一个整数集中的每一个数模k得到的集合是{0,1,...,(k-1)},则称该集合为模k的完系)。因为m*n的棋盘存在1*k矩形的完全覆盖,所以m*n的棋盘中所填的数字中属于模k的不同剩余类的数的个数相等,也就是说,m*n的棋盘上所填的数字中,所有模k得到0的数字的个数=所有模k得到1的数字的个数=...=所有模k得到k-1的数字的个数。
设m=pk+s,n=qk+t,假设s*t<>0,则不妨设0   +---------+------------+
  |         |            |
  |   s*t   |    s*pk    |
  |         |            |
  +---------+------------+
  |                      |
  |        pk*n          |
  |                      |
  +----------------------+

显然,pk*n的矩形和s*pk的矩形可被1*k矩形完全覆盖(由充分性知),所以这两个矩形中属于模k的不同剩余类中的数的个数相等,从而s*t的矩形中属于模k的不同剩余类中的数的个数也应该相等。考察s*t的矩形中所填的数字:
 1   2   3  ....  t-1     t
 2   3   4  ....   t     t+1
 ............................
s-1  s  s+1 .... s+t-3  s+t-2
 s  s+1 s+2 .... s+t-2  s+t-1

将上述的数表作如下改造:对于表中的每一个数a,如果a>k,则将a换作a-k,这并不改变该数模k的余,这样得到一个新的数表,记作A。考察数t与t+1在表A中出现的次数。观察上图可以注意到每一条从右上方到左下方的对角线上的数字都相同,我们从左到右给这些对角线标号。显然,在前t条对角线上不出现t+1。又s+t-1t+1)条对角线上也不出现t+1。所以t+1只出现在第t+1条对角线上,即t+1共出现了s-1次。注意到第t条对角线上的数都为t,所以t在表A中至少出现s次。于是t出现的次数多于t+1出现的次数。易知表A中模k余(t mod k)的数只有t,模k余((t+1) mod k)的数只有t+1,所以A中模k余(t mod k)的数的个数不等于模k余((t+1) mod k)的数,即原来的s*t矩形中属于模k的不同剩余类中的数的个数不相等,矛盾。
所以s*t<>0不成立,即s*t=0。必要性得证。


下面利用定理一将结论扩展到m*n的棋盘的p*q矩形完全覆盖。

定理二:m*n的棋盘的p*q矩形完全覆盖的充要条件是m,n满足下列条件之一:
(i) p|x且q|y
(ii)p|x,q|x且存在自然数a,b,使y=ap+bq
其中{x,y}={m,n}

证:充分性:
若条件(i)满足,不妨设x=m,y=n,令m=ps,n=qt,则m*n的棋盘可以划分为s*t个p*q矩形,结论成立;若条件(ii)满足,不妨设x=m,y=n,即p|m,q|m,且存在自然数a,b使得n=ap+bq。那么,将m*n的棋盘划分为两个棋盘:一个m*ap棋盘,一个m*bq棋盘,这两个棋盘均可以被p*q矩形完全覆盖,所以结论成立。
必要性:
设m*n的棋盘可被p*q矩形完全覆盖,从而m*n棋盘存在1*p矩形的完全覆盖,由定理一知p|m或p|n,同理q|m或q|n,这有以下两种情况:
(1)p,q可以分别整除m,n中的各一个,即有p|x,q|y且{x,y}={m,n},则结论成立;
(2)p,q只能同时整除m,n中的同一个,不妨设p|m,q|m,且p\n,q\n(用符号a\b表示a不整除b)。考察至少盖住第一行中一个格的那些覆盖形,设其中以"p*q"方式覆盖的矩形有b块,以"q*p"方式覆盖的矩形有a块,再注意到第一行共有n个格,所以n=ap+bq,结论成立。
必要性得证。


根据这个条件,你很容易求出最多可排列的小矩形的数目,至于具体的排列方法,可以用回溯法搜索.

推荐阅读
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了游戏开发中的人工智能技术,包括定性行为和非定性行为的分类。定性行为是指特定且可预测的行为,而非定性行为则具有一定程度的不确定性。其中,追逐算法是定性行为的具体实例。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
author-avatar
想太多先生的微博
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有