Algorithm 避免矩阵算法中的位置冲突
假设你有一个nxm矩阵。在此矩阵中,您将随机定位四个不同的对象,例如a、b、c、d。每一个都会有很多 现在最好的算法是什么,这样当它们被随机放置时,它们的位置不会发生冲突 我的做法是:Algorithm 避免矩阵算法中的位置冲突,algorithm,matrix,nearest-neighbor,neighbours,Algorithm,Matrix,Nearest Neighbor,Neighbours,假设你有一个nxm矩阵。在此矩阵中,您将随机定位四个不同的对象,例如a、b、c、d。每一个都会有很多 现在最好的算法是什么,这样当它们被随机放置时,它们的位置不会发生冲突 我的做法是: 随机放置 检查所有对象的位置,如果它们发生碰撞,请继续移动,直到找到一个空的空间 我只是想知道是否还有其他有效的解决方案。如果最终目标是填充电路板,您可以为矩阵上的每个空格选择其中的类型(选择是随机的) 要添加空白选项,请添加第五个NO_类型的选项 如果已知外观的数量,请尝试以下操作: 创建一个大小为n X m(
我只是想知道是否还有其他有效的解决方案。如果最终目标是填充电路板,您可以为矩阵上的每个空格选择其中的类型(选择是随机的) 要添加空白选项,请添加第五个NO_类型的选项 如果已知外观的数量,请尝试以下操作:
pos=rand(L)
,并从列表中删除该值(不要忘记减少L)另一个答案的变体,无需创建额外的结构(且具有更好的时间复杂性):
假设你有对象a_1,…,a_K(在你的例子中K=4)每一个都必须出现n_k次,使用n_1+…+n_k如果你有一个算法可以生成一系列随机位置,这些位置在你的数组中不会发生冲突,那么你可以很容易地生成你需要的任意多个位置a然后b然后c然后d等等 您可以使用以下算法完成此操作:
Generate a random prime number p that is greater than n * m
Generate a random number r in the range [0, n * m)
while(need more numbers)
{
// output a position:
yield x = r % n, y = r / n
// generate the next position:
r = (r + p) % (n * m)
}
位置永远不会重叠,因为p和n*m之间没有公共因子。它将产生一个大于n*m的值
有关如何生成随机素数,请参见此问题:
如果p是素数,那么它将是n*m的相对素数
另见这个问题:
如果一个人有一个固定的数量,比如说a必须出现五次,那该怎么办?
Generate a random prime number p that is greater than n * m
Generate a random number r in the range [0, n * m)
while(need more numbers)
{
// output a position:
yield x = r % n, y = r / n
// generate the next position:
r = (r + p) % (n * m)
}