在2d网格上找到最大效果区域重叠

时间:2011-03-21 09:54:41

标签: algorithm math graph

我希望编写一个程序来帮助我优化2D网格。在该网格中,存在“块”,其具有确定其效果区域的范围。可以在网格上放置许多块。每个块可能占用超过1个图块,但总是正方形。我想找出效果区域可以与单个XY位置重叠的最大次数。

我需要计算36个组合(4个块类型 - 1x1,2x2,3x3和4x4,范围1-9)

效果区域始终呈方形图案。在下面的示例中,字母是块,数字是效果区域的位置。 A是1x1块,其效果区域为1.B是1x1块,效果区域为2.C是2x2块,效果区域为1.

X X X X X
X 1 1 1 X
X 1 A 1 X
X 1 1 1 X
X X X X X

X X X X X X X
X 2 2 2 2 2 X
X 2 2 2 2 2 X
X 2 2 B 2 2 X
X 2 2 2 2 2 X
X 2 2 2 2 2 X
X X X X X X X

X X X X X X
X 1 1 1 1 X
X 1 C C 1 X
X 1 C C 1 X
X 1 1 1 1 X
X X X X X X

我可以根据需要在网格上放置尽可能多的块,我想知道效果区域与目标图块重叠的次数。例如,如果我有一个A图块(1x1有1个范围),我通过围绕目标T来最大化效果区域。所以这里的答案是8。

X X X X X
X A A A X
X A T A X
X A A A X
X X X X X

任何人都知道如何解决其他组合问题?谢谢!

2 个答案:

答案 0 :(得分:1)

您需要的是某种形式的空间分区,以便轻松找到影响特定位置的块。谷歌搜索“树算法”应该让你了解划分空间的各种方法,但总体思路是:

for each block
  addblock (root, block)

addblock (node, block)
  if block fits inside node
    if there are child nodes
      for each child
        addblock (child, block)
    else
      add block to node by dividing into area occupied by block and areas not occupied by block, moving any blocks at this node into all new child nodes
  else
    if there are child nodes
      for each child
        addblock (child, block)
    else
      add block to node block list

然后,要查找覆盖正方形的块数,请在树中搜索覆盖给定方块的节点,然后查看该节点中有多少块。

答案 1 :(得分:0)

你想要的是像Z曲线或希尔伯特曲线那样的空间填充曲线,然后计算索引将其转换为每个瓦片的四叉树键。 sfc将2D问题减少为1D问题。然后使用新密钥,您要执行DFS或BFS以查找重叠的切片。我在phpclasses.org(hilbert-curve)中为php编写了一个sfc类。欢迎您下载。