algorithm - 涉及穿过矩形的正交线的几何问题的算法
问题描述
我被这个编程问题困了一段时间,真的不知道该怎么做。
我们得到一个大矩形,以及大矩形内的一系列较小的非重叠矩形。
您如何设计一种算法来找到使用正交线将大矩形划分为的最大分区数,因为 1)每个分区必须至少有一个较小的矩形,并且 2)每当绘制一条线时,分区的数量必须至少增加 1。
解决方案
规则 (2) 意味着您的切割线永远不会交叉 - 每一条都将现有分区切割成 2 块。
规则 (1) 意味着您实际上只是想找到可以使用水平或垂直切割将小矩形划分为的组数。很多时候,答案将与小矩形的数量相同,但有时您无法将它们全部划分。例如,如果不将其中至少一个一分为二,就无法切割以这种方式排列的一组矩形:
AAAAAAAA BBB
AAAAAAAA BBB
BBB
CCC BBB
CCC BBB
CCC
CCC DDDDDDDD
CCC DDDDDDDD
要创建尽可能多的组,您可以遵循一个简单的递归过程:
- 尽可能多地进行垂直切割
- 在每个生成的分区中,尽可能多地进行水平切割
- 在每个生成的分区中,返回 (1) 直到您不能进行任何新的切割
要确定您可以在分区中进行的最大切割次数,您只需考虑另一个方向上每个矩形的结束坐标(例如,如果您正在垂直切割,则查看每个矩形最大 X)。如果通过该坐标的线不与任何其他矩形相交,则在此处剪切。
推荐阅读
- r - Rmarkdown nocite 不显示 pdf 中的引文
- javascript - 这个 indexOf 查询不起作用是有原因的吗?
- python-3.x - 有没有办法将 spacy 训练的模型加载到 gensim 中?
- ansible - Ansible become 报告成功,但由于缺少权限,命令失败
- mongodb - 我在 Jmeter 中的 groovy 脚本执行没有错误,但无法在 Mongo DB 中插入文档,这可能是什么问题?
- python - 读取另一个文件的每一行后更快地填充文件的方法
- laravel - 未设置/存储 Httponly cookie (Laravel / Vue)
- react-native - 如何在本机反应中禁用已经选择的开始日期和结束日期的日期
- laravel-5 - Laravel 自定义属性影响数据插入到 db
- java - 有没有办法使用 where 条件将 Mediastore 游标设置为 Rowset 中的特定行?