Algorithm 在二维栅格上查找效果重叠的最大面积

Algorithm 在二维栅格上查找效果重叠的最大面积,algorithm,math,graph,Algorithm,Math,Graph,我希望写一个程序来帮助我优化二维网格。在该网格中,有一些“块”,其范围决定了其效果区域。可以在网格上放置许多块。每一块砖可能占用1块以上的瓷砖,但始终是方形的。我想找出效果区域与单个XY位置重叠的最大次数 我需要为36种组合(4种块类型——1x1、2x2、3x3和4x4,以及范围1-9)计算出这一点 效果区域始终为方形图案。在下面的示例中,字母是块,数字是效果区域所在的位置。A是一个1x1块,其作用面积为1。B是一个1x1块,其作用面积为2。C是一个2x2的块,作用面积为1 X X X X X

我希望写一个程序来帮助我优化二维网格。在该网格中,有一些“块”,其范围决定了其效果区域。可以在网格上放置许多块。每一块砖可能占用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

有人知道我怎么能把其他的组合计算出来吗?谢谢

您需要的是某种形式的空间分区,以便很容易找到影响特定位置的块。谷歌搜索“树算法”应该会让你对划分空间的各种方法有一个想法,但总体思路是:

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

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

您需要的是某种形式的空间划分,以便很容易找到影响特定位置的块。谷歌搜索“树算法”应该会让你对划分空间的各种方法有一个想法,但总体思路是:

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

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

您需要的是一条空间填充曲线,如Z曲线或希尔伯特曲线,然后计算索引,将其转换为每个分幅的四叉树键。sfc将二维问题简化为一维问题。然后使用新键执行DFS或BFS以查找重叠的平铺。我在phpclasses.org上用php为sfc编写了一个类(希尔伯特曲线)。欢迎下载

您需要的是一条空间填充曲线,如Z曲线或希尔伯特曲线,然后计算索引,将其转换为每个分幅的四叉树键。sfc将二维问题简化为一维问题。然后使用新键执行DFS或BFS以查找重叠的平铺。我在phpclasses.org上用php为sfc编写了一个类(希尔伯特曲线)。欢迎下载