根据2D网格中的点找到所有可能的矩形

时间:2013-11-16 14:48:20

标签: algorithm lua multidimensional-array lua-table

我得到了以下地图

local Map = {
    [1] = {
        [1] = 'Sand',
        [2] = 'Sand',
        [3] = 'Sand'
    },
    [2] = {
        [1] = 'Sand',
        [2] = 'Sand',
        [3] = 'Grass'
    },
    [3] = {
        [1] = 'Rock',
        [2] = 'Rock',
        [3] = 'Grass'
    },
}

上面的地图:

S = Sand
G = Grass
R = Rock
S S R
S S R
S G G

并尝试创建一个我提供点的函数,它返回一个包含该类型的所有可能矩形的数组。

这样的东西
function GetRectangles(X, Y)
local Type = Map[X][Y]
local Result = {}
-- Get all rectangles with same type and add to array
return Result
end

所以,当我调用GetRectangles(1,1)时,它会返回一个包含以下矩形的数组

  • 矩形从1,1开始,结束于2,2
  • 在1,1和13
  • 处的矩形挞

当我调用GetRectangles(3,3)时,它会返回一个包含以下内容的数组

  • 矩形从3,3开始,到2,3
  • 结束

我该怎么做?

1 个答案:

答案 0 :(得分:1)

考虑回溯。

recursive step:
    for each step in possible steps:
        check new rectangle for single type
            if ok, add to rectangle list and recurse

可能的步骤是:向左添加1列,向右添加1列,在上方添加1行,在下方添加1行。

示例:

current rectangle (1,1), (1,1)
   rectangle is ok
   add 1 row below:
   current rectangle (1,1), (1,2)
       rectangle is ok, add
       add 1 row below
            current rectangle (1,1) (1,3)
            rectangle ok, add
            // add 1 row below not possible step
            add 1 column left  
            rectangle (1,1) (2,3) not ok
            no more steps    
       add 1 column left
       rectangle (1,1) (2,1) not ok
       no more steps
   etc...

表示重叠,迭代列表并删除它们或提示:这可以在迭代期间完成。