【问题标题】:Largest Empty Rectangle Within a Rectangle矩形内最大的空矩形
【发布时间】:2013-03-05 03:35:53
【问题描述】:

我的数学不是很好,所以我很难将公式转换为代码,而且我找不到任何现成的谷歌搜索。我有一个包含很多小矩形的大矩形......我需要做的就是计算最大的空矩形。有谁能帮帮我吗?

这是我想出来的……没什么好说的,这是一个很大的失败。

Rect result = new Rect();

for (Double l = 0; l < bigRect.Width; ++l)
{
    for (Double t = 0; t < bigRect.Height; ++t)
    {
        Double h = 0;
        Double w = 0;

        while ((h <= bigRect.Width) && (w <= bigRect.Height))
        {
            Rect largestEmpty = new Rect(l, t, w, h);

            if (smallRects.TrueForAll(smallRect => !smallRect.IntersectsWith(largestEmpty)) && ((largestEmpty.Height * largestEmpty.Width) > (result.Height * result.Width)))
                result = largestEmpty;
            else
                break;

            ++h;
            ++w;
        }
    }
}

【问题讨论】:

标签: c# .net algorithm dynamic-programming


【解决方案1】:

从您的Perdue Docs Link 中可以看出,Big Rect 中有一组点(我们称之为 ASD),您将找到不包含该组 ASD 点的最大 Rect。查看您的代码,您似乎没有(直接)合并这些要点。我会从较小的 Rects 中提取点并创建集 ASD。由于您使用的是 double 类型,因此您应该可以访问这些点,否则该算法的运行时间会显着增加,因为您需要检查特定范围(整个 Big Rect)中所有可能的 double。使用这些点,我会尝试找到彼此距离最短的点 (sqrt(dx^2+ dy^2)) (最短的不应该包含任何点)然后转到下一个最短的点,看看是否有任何点包含等等。换句话说,创建一个按距离排序的所有组合的顺序列表(不是排列,(a,b)到(c,d)应该是==(c,d)到(a,b))在他们之间。可能不是最佳的,但可以完成工作。

编辑:除了较小矩形的对角线之外的所有订单对都应该在订单列表中,因为不应包含较小的矩形,您还可以排除具有相同 x 或 y 值的对。

【讨论】:

    猜你喜欢
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多