Algorithm 如何遍历所有可能的网格布局?

Algorithm 如何遍历所有可能的网格布局?,algorithm,combinatorics,Algorithm,Combinatorics,我有一个网格(一个CGPoints的NSArray),我想根据一些约束在点上布局一些对象。这就是我所知道的: 电网有多大 在某一点上必须在栅格上布局的对象数 一个对象到另一个对象之间的最小距离(使用毕达哥拉斯魔法计算) 网格上点之间的距离 每个点只能有一个位于那里的对象 我选择一个随机对象(使用arc4random)并验证这是否是一个有效点。如果是,则将其标记为这样并选择另一个点。如果不是,则继续,直到搜索整个阵列,并在该点将此网格布局标记为不可能,然后重新开始 直到找到有效的网格布局为止

我有一个网格(一个
CGPoint
s的
NSArray
),我想根据一些约束在点上布局一些对象。这就是我所知道的:

  • 电网有多大
  • 在某一点上必须在栅格上布局的对象数
  • 一个对象到另一个对象之间的最小距离(使用毕达哥拉斯魔法计算)
  • 网格上点之间的距离
  • 每个点只能有一个位于那里的对象
我选择一个随机对象(使用
arc4random
)并验证这是否是一个有效点。如果是,则将其标记为这样并选择另一个点。如果不是,则继续,直到搜索整个阵列,并在该点将此网格布局标记为不可能,然后重新开始

直到找到有效的网格布局为止

问题:
我不知道对于给定的约束,是否存在有效的布局。因此,在开始不可能的搜索之前,我很难找到一种方法来计算可能的排列,或者迭代搜索排列,以找到是否存在任何有效的网格。

有些事情不太清楚。对于每一对对象,是否有一个数字给出这两个对象之间的最小允许距离?在一个网格点上可以出现多个对象吗?@j_random_hacker是的,有一个参数定义了对象之间的最小距离(对不起,修复了这个问题),并且在一个网格点上只能出现一个对象。我的特殊问题是在一个区域内随机布置一些树木,但也要补偿树木的最大蔓延,以避免重叠。好的,是不是每对对象的最小距离都相同?(即只有一个参数?)对象是否都无法区分?(即,如果我们交换对象1和对象2的位置,结果将“不变”?)如果是这样,并且如果最小距离参数为d,则(在没有网格的情况下)放置对象的最紧密方式将是将它们放置在六角圆中排列的半径为d/2的圆心处:。这对于有限区域来说并不完全正确,但这是一个很好的近似值,通过选择离中心最近的网格点,你可以得到最佳位置的一个很好的近似值。@j#U random#U hacker是的,交换对象#1和#2不会改变任何东西,所以我想知道这是否可能,我可以使用min distance参数计算一个对象所需的面积,乘以要布局的对象数量,并将其与总网格面积进行比较,并补偿不关心网格边缘和对象之间的距离(距离限制仅适用于对象之间)。