最大矩形区域没有任何怪物

时间:2014-01-05 18:43:37

标签: algorithm dynamic-programming

给定一个N * M(基于1的索引)的矩形网格,其中它们是k个不同单元格上的k个怪物。现在我们需要回答Q查询,其中我们将得到最低行数(L)和最高行数字(H)我们需要告诉那些没有怪物的行之间的矩形最大区域。(这里矩形区域仅表示单元格的数量)

示例:假设我们有一个4 * 5的网格(平均n = 4和m = 5),并且怪物位于7(= k)个单元格(1,3),(1,4),( 2,1),(2,4),(3,2),(4,1),(4,2)让我们得到1个查询,其中L = 3且H = 4,那么最大面积为6

现在,如果查询非常大,请说10 ^ 6.然后如何解决这个问题。这是他们的任何动态方法还是这样做?

enter image description here

这里红色方块表示怪物,紫色方块表示解决方案矩形

2 个答案:

答案 0 :(得分:1)

这是一个递归解决方案,适用于任意大小的地下城和相对较少的怪物。

如果地牢中有一个怪物(x,y)(n,w,s,e),则有两种情况。案例1是微不足道的:怪物在地牢之外。然后最大的矩形是地牢。 (地下城总是长方形,对吧?)。

在案例2中,最大矩形是怪物北面,西面,南面或东面的一个矩形:

NNNNNNNNNN    ....EEEEEE    ..........    WWW.......
NNNNNNNNNN    ....EEEEEE    ..........    WWW.......
NNNNNNNNNN    ....EEEEEE    ..........    WWW.......
NNNNNNNNNN    ....EEEEEE    ..........    WWW.......
NNNNNNNNNN    ....EEEEEE    ..........    WWW.......
...@......    ...@EEEEEE    ...@......    WWW@......
..........    ....EEEEEE    SSSSSSSSSS    WWW.......
..........    ....EEEEEE    SSSSSSSSSS    WWW.......
..........    ....EEEEEE    SSSSSSSSSS    WWW.......

现在递归地将此推理应用于您的怪物位置列表,并跟踪到目前为止的最大值。这是一些伪代码:

max_area = 0
max_rect = Null

sub find_max_rect(Dungeon, Monsters)

    if area(Dunegon) <= max_area: 
        return                      # save time for small dungeons

    if Monsters is empty:
        if area(Dungeon) > max:
            max_rect = Dungeon
            max_area = area(Dungeon)

    else
        M = Monsters.pop()          # Remove head from list

        if M in Dungeon:
            find_max_rect(Subrect(Dungeon, M, North), Monsters)
            find_max_rect(Subrect(Dungeon, M, East), Monsters)
            find_max_rect(Subrect(Dungeon, M, South), Monsters)
            find_max_rect(Subrect(Dungeon, M, West), Monsters)
        else:
            find_max_rect(Dungeon, Monsters)

注意:我在上面的草图中实际上犯了一个明显的错误:@当然代表玩家而不是怪物。

答案 1 :(得分:0)

你知道最大矩阵和问题吗?使用动态编程可以在O(n ^ 3)时间内解决该问题。

你的问题非常类似。你需要的是分配每个空网格值1和每个怪物网格值-INF。然后在应用最大矩阵求和解后,得到最大面积。