填充网格的最小矩形区域数

2024-04-22

假设我们有一个网格,并且希望使用尽可能少的颜色(每个区域一种颜色)在其上绘制矩形区域。

有一些单元格已经被涂成黑色并且无法被涂掉:

有没有多项式算法可以解决这个问题?

经过测试,我发现这种情况的解决方案是9(因为我们需要9种不同的颜色来绘制填充整个网格的最小区域数):


贪婪的方法似乎效果很好:只需搜索具有最大(白色)区域的矩形并绘制它,重复此操作直到没有其他可绘制的,但我没有测量复杂性或正确性。


以下是一些可以在特定情况下简化此问题的观察结果。首先,在不改变所需区域数量的情况下,可以将相邻的相同行和列缩减为一行或一列,形成一个简化的网格:

一个简化的网格,其中没有行或列被分成两个以上的无色部分(即具有两个或多个单独的黑色单元),具有可以通过使用行或列作为区域来找到的最佳解决方案(取决于宽度或宽度)网格的高度更大):

那么区域的数量就是最小值(宽度,高度)+ 黑色单元格数量.

如果简化网格中的边框行或列不包含黑色单元格,则将其用作区域始终是最佳解决方案;将其某些部分添加到其他区域将需要在边框行或列中至少创建一个附加区域(取决于相邻行或列中黑色单元格的数量):

这意味着可以通过删除没有黑色单元格的边框行和列,并将删除的区域数量添加到区域计数来进一步简化网格:

类似地,如果一个或多个边界单元被相邻行或列中的黑色单元隔离,则所有相连的未着色相邻单元可以被视为一个区域:

在每一点你都可以回到之前的规则;例如在上面的示例中,最右边和最左边的列变成区域后,我们剩下下面的网格,可以使用第一条规则进行简化,因为底部两行是相同的:

折叠相同的相邻行或列也可以局部应用于网格的隔离部分。下面的示例没有相同的相邻行,但中心部分是隔离的,因此第 3 行到第 6 行可以折叠:

左边的第 3 行和第 4 行可以局部折叠,右边的第 5 行和第 6 行可以局部折叠,所以我们最终得到上面第三张图中的情况。这些塌陷的细胞然后作为一个整体。


一旦您无法使用上述规则找到任何进一步的简化,并且您想要检查网格(部分)的每个可能的划分,第一步可能是列出可以使用相应单元格制作的最大矩形尺寸,如下所示他们的左上角;对于上面第一个示例中的简化 6x7 网格,将是:

        COL.1            COL.2       COL.3       COL.4       COL.5  COL.6

ROW 1   [6x1, 3x3, 1x7]  [5x1, 2x3]  [4x1, 1x7]  [3x1]       [2x5]  [1x7]
ROW 2   [3x2, 1x6]       [2x2]       [1x6]       []          [2x4]  [1x6]
ROW 3   [6x1, 1x5]       [5x1]       [4x3, 2x5]  [3x3, 1x5]  [2x3]  [1x5]
ROW 4   [1x4]            []          [4x2, 2x4]  [3x2, 1x4]  [2x2]  [1x4]
ROW 5   [6x1, 4x3]       [5x1, 3x3]  [4x1, 2x3]  [3x1, 1x3]  [2x1]  [1x3]
ROW 6   [4x2]            [3x2]       [2x2]       [1x2]       []     [1x2]
ROW 7   [6x1]            [5x1]       [4x1]       [3x1]       [2x1]  [1x1]

然后,您可以使用这些最大大小为每个单元格生成每个选项;例如对于单元格 (1,1),它们将是:

6x1, 5x1, 4x1, 3x3, 3x2, 3x1, 2x3, 2x2, 2x1, 1x7, 1x6, 1x5, 1x4, 1x3, 1x2, 1x1

(可以跳过列表中的某些矩形大小;例如,在不添加第四个独立单元格以获得 4x1 的情况下使用 3x1 大小的区域是没有意义的。)

选择一个选项后,您将跳过您选择的矩形覆盖的单元格,并尝试下一个单元格的每个选项,依此类推......

在大型网格上运行它会导致大量的操作选项。但是,在每个点上,您都可以返回检查简化规则是否有帮助。


要知道首先选择最大矩形的贪心算法不能保证最佳解决方案,请考虑下面的示例。选择中间的 2x2 正方形将导致具有 5 个区域的解决方案,而存在多个仅具有 4 个区域的解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

填充网格的最小矩形区域数 的相关文章

  • Java:使用indexOf方法根据另一个数组对数组进行排序

    我想根据另一个数组 索引 的排序顺序迭代两个数组 A B 在本例中为 10 34 32 21 String A a b c d String B e f g h int indexes 10 34 32 21 为这里的坏例子道歉 我已经更新
  • 给定两个(大)点集,我如何有效地找到彼此最接近的点对?

    我需要解决一个计算问题 该问题归结为搜索两个集合之间最接近的点对 问题是这样的 给定欧几里德空间中的一组点 A 和一组点 B 找到所有对 a b 使得 b 是 B 中与 a 最近的点 a 是 A 中与 b 最近的点 集合 A 和 B 的大小
  • 当目标是查找某个字符串的所有出现情况时,KMP 最坏情况的复杂度是多少?

    我还想知道哪种算法在查找另一个字符串中所有出现的字符串时具有最坏情况的复杂性 博耶 摩尔算法似乎具有线性时间复杂度 KMP 算法在查找字符串中所有出现的模式时具有线性复杂度 如 Boyer Moore 算法1 如果您尝试在 aaaaaaaa
  • 如何使用KDTrees实现最近邻搜索?

    所以 我正在实施一个KD Tree http en wikipedia org wiki Kd tree进行最近邻搜索 我已经构建了树部分 但我认为我没有完全理解搜索部分 关于遍历树来搜索邻居 维基百科文章如下 Starting with
  • Bellman-Ford 算法检测什么?负重还是负循环?

    如果给定一个图 现在我们要从源头计算最短路径 现在 如果一条边具有负权重 但在到达目的地时有边到后边返回到该边 我的意思是如果没有循环 那么我们就没有负循环 但是here http en wikipedia org wiki Bellman
  • 用于插入/删除/排名/选择查询的最佳数据结构/算法

    到目前为止 我知道像AVL树和红黑树这样的自平衡BST可以在O log n 次内完成这些操作 然而 要使用这些结构 我们必须自己实现AVL树或RB树 我听说有一个算法 实现这四个操作而不使用自平衡 BST 有了我们自己定义的结构 我们就需要
  • 哪种数据聚类算法适合检测时间序列事件中未知数量的聚类?

    这是我的场景 考虑在不同地点和时间发生的一组事件 例如 考虑有人在高空记录暴风雨期间城市中的雷击 就我的目的而言 闪电是瞬时的 只能击中某些位置 例如高层建筑 还可以想象每次雷击都有一个唯一的 ID 以便以后可以参考该雷击 这个城市大约有1
  • 反转二进制网络

    如何反转二元方程 以便找到哪些输入将产生给定的输出 Example Inputs i0 through i8 Outputs o0 through o8 Operators XOR AND 二元方程 1 i0 1 i1 0 i2 1 i3
  • 使到 n 个点的集合的欧氏距离之和最小的点

    我有一组点W x1 y1 x2 y2 xn yn 在 2D 平面上 你能找到一种算法 将这些点作为输入并返回一个点 x y 在 2D 平面上 距以下点的距离之和最小W 换句话说 如果 di Euclidean distance x y xi
  • C 中的菱形数组排序

    我有以下 C 语言作业 我基本上需要一种方法而不是解决方案 我们有一个 13 x 13 的数组 在数组中 我们有一个需要考虑的菱形形状 该菱形之外的所有内容都初始化为 1 不重要 下面的 5 x 5 数组示例 x x 1 x x x 2 2
  • Python 给定 k 个分区的整数分区

    我正在尝试寻找或开发Python 的整数分区代码 仅供参考 整数分区将给定整数 n 表示为小于 n 的整数之和 例如 整数5可以表示为4 1 3 2 3 1 1 2 2 1 2 1 1 1 1 1 1 1 1 我为此找到了许多解决方案 ht
  • 使用FFT算法计算

    给定在平面上的点 1 0 2 0 n 0 上发现的一组 n 个粒子电荷载流子 在 i 0 点发现的粒子电荷记为 Qi 作用在粒子上的力由以下公式给出 C is a Coulomb s constant 给出一个算法来计算 Fi 对于总复杂度
  • 线性代数如何在算法中使用?

    我的几个同行都提到 学习算法时 线性代数 非常重要 我研究了各种算法并学习了一些线性代数课程 但我没有看到其中的联系 那么线性代数如何应用在算法中呢 例如 图的连接矩阵可以带来哪些有趣的事情 三个具体例子 线性代数是现代 3D 图形的基础
  • 如何高效地在屏幕上精确绘制N个点?

    这听起来是一个简单的问题 但我发现要获得良好的性能是非常棘手的 我提出的第一个算法是随机绘制点 从一组中检查是否已绘制 否则绘制 如果我们只绘制几个点 那么这种方法效果很好 但当我们接近填满屏幕时 速度会灾难性地减慢 我想出的最好的方法是构
  • 通过分布式数据库聚合作业优化网络带宽

    我有一个分布式 联合数据库 结构如下 数据库分布在三个地理位置 节点 每个节点集群有多个数据库 关系数据库是 PostgreSQL MySQL Oracle 和 MS SQL Server 的混合体 非关系数据库是 MongoDB 或 Ca
  • 如何从一组重叠的圆计算多边形集?

    这个问题是一些计算细节的扩展这个问题 https stackoverflow com questions 1667310 combined area of overlapping circles 假设有一组 可能重叠的 圆 并且希望计算这组
  • 图中的后边

    I m having a hard time understanding Tarjan s algorithm for articulation points I m currently following this tutorial he
  • 我需要一个支持高效随机访问和 O(k) 插入和删除的容器

    我再次尝试问同样的问题question https stackoverflow com questions 3808708 delete parts of a dynamic array and grow other 但我最终提出了一个不同
  • 如何将一组重叠范围划分为不重叠范围?

    假设您有一组范围 0 100 一 0 75 b 95 150 c 120 130 d 显然 这些范围在某些点上重叠 您将如何剖析这些范围以生成不重叠范围的列表 同时保留与其原始范围相关的信息 在本例中为范围后面的字母 例如 运行算法后的上述
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已

随机推荐

  • 基于不同列值的默认列值

    SQL Server 2005 我有一个带有 Column 的表 但是 Column int 我可以添加默认值吗ColumnB以便ColumnB是 15 如果ColumnA是 1 并且ColumnB是 0 如果ColumnA is 0 我知
  • C 中的指针与数组,非同小可的区别

    我以为我真的理解了这一点 重新阅读标准 ISO 9899 1990 只是证实了我明显错误的理解 所以现在我在这里问 以下程序崩溃 include
  • 如何在变量中引用带有空格的文件名或路径? [复制]

    这个问题在这里已经有答案了 我正在尝试编写一个简单的 shell 脚本 但很难弄清楚为什么我不能在用于在 shell 脚本中生成文件名的字符串变量中保留空格 bin bash let minus3 10 date Y 3 let minus
  • 如何编写 boost::spirit::qi 解析器来解析从 0 到 std::numeric_limits::max() 的整数范围?

    我尝试使用qi uint parser
  • C# 如何计算出对象的哈希码?

    这个问题来自于讨论tuples https stackoverflow com questions 101825 whats the best way of using a pair triple etc of values as one
  • 如何检查 MySQL 和 Tomcat 是否正在运行?

    我创建了一个 Java 应用程序 该应用程序分为不同的子组件 每个子组件都在单独的 Tomcat 实例上运行 此外 某些组件通过 Hibernate 使用 MySQL 数据库 我现在正在创建一个管理控制台 在其中报告所有 Tomcat 实例
  • 使用 ashx 处理程序显示图像

    我的 aspx 页面中有以下图像 td td
  • Glassfish 和 JBoss 5 的现实比较?

    在现实世界中有人有这两种经历吗 它们在性能 内存使用 速度等 方面如何比较 稳定 JBoss Seam 在 Glassfish 上运行良好吗 从我自己的经历来看 有几点 GlassFish 拥有更好的管理控制台 JBoss 有三个控制台 每
  • 从 PyQt GUI 连接到串行

    我编写了一个程序来从串行发送和接收数据 但是我有一个问题 我想创建一个函数 connect 或一个类 当我按下按钮时 该函数就会被执行 但是如果我创建 MainWindow 类中的这个函数 TestThread 类中的变量 ser 未初始化
  • 错误:EBADF,使用永远的 nohup 运行节点时错误的文件描述符

    我在运行小型 Web 服务器 从文件系统提供文件 时遇到 Node js 问题 当开始时node server js它的工作方式就像一个魅力 但是当用 nohup 或永远的 Node js 启动它时找不到文件 这对我有用 nohup nod
  • 如何 grep 查找同一行中存在的两个单词? [复制]

    这个问题在这里已经有答案了 如何 grep 查找包含两个输入单词的行 我正在寻找包含这两个单词的行 我该怎么做 我尝试过这样的管道 grep c word1 grep r word2 logs 它只是在第一个管道命令之后卡住了 Why 为什
  • 关于使用 playframework 实现购物车的建议

    我正在学习使用playframework通过编写代码来实现webstore用于销售物品 我已经实施了Admin区域使用crud and secure模块 现在 我想创建一个shopping cart用户可以向其中添加商品并继续结账 我对电子
  • 如何更改 codeigniter 中显示的错误

    The URI you submitted has disallowed characters 我该如何拦截这个错误 他们是一个callback 功能 当我尝试在 URL 中使用 时 会发生此错误 例如 我输入 1 1 我得到这个错误 我想
  • ios5 - 带有故事板的模态视图控制器的大小

    有没有什么方法可以调整使用故事板segue以模态方式呈现的视图控制器的大小 如何通过翻转过渡从该模态视图控制器中呈现另一个视图控制器 如果我将其定义为 Style Modal Presentation Default Transition
  • hibernate是否支持count(*) over()

    我试图避免必须为计数创建一个单独的查询 为实际查询创建一个单独的查询 我发现 SessionImpl createQuery 需要相当多的时间来执行复杂的查询 通过将 count 和主查询结合起来 我可以消除一个 createQuery 调
  • 我们如何修复透明/半透明可组合项上的材质阴影故障?

    如果您还不知道 Android 的材质阴影存在一个缺陷 即材质设计及其表面 照明和高度概念带来的阴影 另外 如果您不知道 Compose 使用许多与View框架 包括那些负责所述阴影的框架 因此它具有与View是的 至少现在是这样 Card
  • 将数据传递到startup.cs

    如何将数据传递到startup cs 这是用于集成测试使用WebHostBuilder and TestServer 我需要根据测试夹具传递不同的数据 因此 例如 不想从配置文件中提取它 数据将提供给startup cs中注册的中间件 文档
  • 使用 Python Pandas 使用每日数据计算月平均值

    我有一个包含四列的文本文件 年 月 日和雪深 这是 1979 年至 2009 年 30 年期间的每日数据 我想使用 pandas 计算 360 个 30 年 X 12 个月 个人月平均值 即隔离 1979 年 1 月 1979 年 2 月
  • 页面速度洞察删除 Google Recaptcha 未使用的 JavaScript

    我有一个网站在 Google Page Speed Insights 上得分很高 但它显示了一个性能问题 并显示此文件的 删除未使用的 JavaScript https www gstatic com recaptcha releases
  • 填充网格的最小矩形区域数

    假设我们有一个网格 并且希望使用尽可能少的颜色 每个区域一种颜色 在其上绘制矩形区域 有一些单元格已经被涂成黑色并且无法被涂掉 有没有多项式算法可以解决这个问题 经过测试 我发现这种情况的解决方案是9 因为我们需要9种不同的颜色来绘制填充整