c – 在2D数组中查找最大的矩形

我需要一个算法,它可以解析2D数组并返回最大的连续矩形.作为参考,请看我演示我的问题的图像.

解决方法

通常,您使用所谓的扫描线算法来解决这些问题.在您的案例候选矩形中,他们一次检查一行(或扫描线)的数据,构建您正在寻找的答案.

这是一个如何工作的大致轮廓.

将图像中的所有行编号为0..6,我将从下往上工作.

检查第0行,你有两个矩形的开头(我假设你只对黑色方块感兴趣).我将使用(x,y,width,height)来引用矩形.两个活动矩形是(1,2,1)和(4,6,1).您将这些添加到活动矩形列表中.此列表按增加x坐标排序.

您现在已完成扫描线0,因此您可以增加扫描线.

检查第1行,您将看到行是否有以下任何一项:

>新的活动矩形
>现有矩形生长的空间
>分裂现有矩形的障碍物
>障碍物,要求您从活动列表中删除矩形

当您沿着该行工作时,您将看到您有一个新的活动矩形(0,1,8,1),我们可以将现有的一个活动矩阵增长到(1,2),我们需要删除有效(4,1)用两个较窄的替换它.我们需要记住这个.这是我们迄今为止看到的最大规模.它被两个新的活动替换:(4,4,2)和(9,2)

因此,在发送扫描线1时,我们有:

>活动清单:(0,(1,(4,(9,2)
>目前为止最大:(4,1)

您将继续这种方式,直到扫描线用完为止.

棘手的部分是编写沿扫描线运行的例程来更新活动列表.如果你做得正确,你只会考虑每个像素一次.

希望这可以帮助.描述有点棘手.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...