我们说我有一些不同颜色的球。为了举个例子,我们假设有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
我不完全确定"相同颜色的两个球之间的最大一致距离"会是但是有某种算法或通用解决方案可以解决这个问题吗?如果是这种情况,这个问题的正式名称是什么?
答案 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 }