算法:如何均匀分布不同颜色的球?

时间:2017-10-05 01:33:34

标签: algorithm sorting combinatorics

我们说我有一些不同颜色的球。为了举个例子,我们假设有4个红球,4个蓝球和2个绿球。如果我想均匀分布这些球,以便保持两个相同颜色的球之间的最一致的距离,我可以有以下顺序:

R-B-G-R-B-R-B-G-R-B

尽管蓝色和红色球与对手的距离始终没有相同,但它们的排列方式可以保持距离一致,同时保持绿球的一致性

在6个红球,5个蓝球和3个绿球的情况下,我可以有类似的东西:

R-B-R-G-B-R-B-G-R-B-R-G-R

我不完全确定"相同颜色的两个球之间的最大一致距离"会是但是有某种算法或通用解决方案可以解决这个问题吗?如果是这种情况,这个问题的正式名称是什么?

1 个答案:

答案 0 :(得分:0)

此问题类似于nD空间中的线条绘制(此处为3D)。因此,您可以使用类似Bresenham / DDA的算法生成具有公平项目分布的序列(而不是在任何维度上公平分布像素移位)。任意found example
(我没有检查它的正确性 - 也许除法dm/2可能会产生比错误加倍更糟的结果)

void plotLine3d(int x0, int y0, int z0, int x1, int y1, int z1)
{
   int dx = abs(x1-x0), sx = x0<x1 ? 1 : -1;
   int dy = abs(y1-y0), sy = y0<y1 ? 1 : -1; 
   int dz = abs(z1-z0), sz = z0<z1 ? 1 : -1; 
   int dm = max(dx,dy,dz), i = dm; /* maximum difference */
   x1 = y1 = z1 = dm/2; /* error offset */

   for(;;) {  /* loop */
      setPixel(x0,y0,z0);
      if (i-- == 0) break;
      x1 -= dx; if (x1 < 0) { x1 += dm; x0 += sx; } 
      y1 -= dy; if (y1 < 0) { y1 += dm; y0 += sy; } 
      z1 -= dz; if (z1 < 0) { z1 += dm; z0 += sz; } 
   }
}

x1-x0替换为第一个颜色计数,将y1-y0替换为秒,依此类推。在成功的if条件下输出相应的颜色:

{x1 -= dx; if (x1 < 0) { x1 += dm; x0 += sx; HERE }