热门标签 | 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,结论成立。
必要性得证。


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

推荐阅读
  • Web开发实践:创建连连看小游戏
    本文详细介绍了如何在Web环境中开发一款连连看小游戏,适合初学者和技术爱好者参考。通过本文,您将了解游戏的基本结构、连线算法以及实现方法。 ... [详细]
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • 本文详细介绍如何在华为手机上安装鸿蒙3.0系统及下载兼容鸿蒙系统的新版应用,包括前期准备、升级途径以及应用下载的具体步骤。 ... [详细]
  • 来自FallDream的博客,未经允许,请勿转载,谢谢。一天一套noi简直了.昨天勉强做完了noi2011今天教练又丢出来一套noi ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
  • 探索CNN的可视化技术
    神经网络的可视化在理论学习与实践应用中扮演着至关重要的角色。本文深入探讨了三种有效的CNN(卷积神经网络)可视化方法,旨在帮助读者更好地理解和优化模型。 ... [详细]
  • 探讨多种方法来确定Java对象的实际类型,包括使用instanceof关键字、getClass()方法等。 ... [详细]
  • 最优化算法与matlab应用3:最速下降法
    最优化算法与matlab应用3:最速下降法最速下降法是一种沿着N维目标函数的负梯度方向搜索最小值的方法。(1)算法原理函数的负梯度表示如下:搜索步长可调整ak,通常记为(第k次迭代 ... [详细]
  • Linux内核中的内存反碎片技术解析
    本文深入探讨了Linux内核中实现的内存反碎片技术,包括其历史发展、关键概念如虚拟可移动区域以及具体的内存碎片整理策略。旨在为开发者提供全面的技术理解。 ... [详细]
  • 通过两幅详细的思维导图,全面解析Spring框架中应用的设计模式及其核心编程理念。 ... [详细]
  • 苹果官方在线商店(中国)提供了关于MacBook Pro的详细信息。通过先进的工厂校准技术,新MacBook Pro能够精确地适应多种色彩空间标准,如sRGB、BT.601、BT.709及P3-ST.2084(HDR),确保用户获得最佳视觉效果。 ... [详细]
  • Hadoop MapReduce 实战案例:手机流量使用统计分析
    本文通过一个具体的Hadoop MapReduce案例,详细介绍了如何利用MapReduce框架来统计和分析手机用户的流量使用情况,包括上行和下行流量的计算以及总流量的汇总。 ... [详细]
  • 如何在电脑上输入百分号
    本文将详细介绍如何在电脑上快速准确地输入百分号,提供多种方法供您选择,包括通过键盘快捷键和系统工具等,希望能为您解决输入特殊字符时遇到的问题。 ... [详细]
  • 本文探讨了在AspNetForums平台中实施基于角色的权限控制系统的方法,旨在为不同级别的用户提供合适的访问权限,确保系统的安全性和可用性。 ... [详细]
  • 如何寻找程序员的兼职机会
    随着远程工作的兴起,越来越多的程序员开始寻找灵活的兼职工作机会。本文将介绍几个适合程序员、设计师、翻译等专业人士的在线平台,帮助他们找到合适的兼职项目。 ... [详细]
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社区 版权所有