假设你有一个二维网格,网格上的每个位置都有x个物体(其中x> = 0)。我在考虑一种简洁的算法,使得当用户指定一个坐标时,该算法能够找到最接近的带有物体的坐标(包括指定的坐标)。
为了简单起见,我们假设如果两个坐标的距离相同,则返回第一个(或者如果您的算法不按此方式工作,则返回最后一个,没有关系)。
编辑:距离为1的坐标必须是向上、下、左或右移动一步。斜着移动的坐标距离为2。
另外,有哪些优秀的免费在线算法参考资料?
假设你有一个二维网格,网格上的每个位置都有x个物体(其中x> = 0)。我在考虑一种简洁的算法,使得当用户指定一个坐标时,该算法能够找到最接近的带有物体的坐标(包括指定的坐标)。
为了简单起见,我们假设如果两个坐标的距离相同,则返回第一个(或者如果您的算法不按此方式工作,则返回最后一个,没有关系)。
编辑:距离为1的坐标必须是向上、下、左或右移动一步。斜着移动的坐标距离为2。
另外,有哪些优秀的免费在线算法参考资料?
更新
根据最新的信息:
假设两个坐标之间的对角线距离为2,则此算法可以起到作用。该算法以螺旋形式向外搜索,测试从内部开始的每个'环'中的每个点。
请注意,它无法处理越界情况。因此,您应该根据自己的需要进行更改。
int xs, ys; // Start coordinates
// Check point (xs, ys)
for (int d = 1; d<maxDistance; d++)
{
for (int i = 0; i < d + 1; i++)
{
int x1 = xs - d + i;
int y1 = ys - i;
// Check point (x1, y1)
int x2 = xs + d - i;
int y2 = ys + i;
// Check point (x2, y2)
}
for (int i = 1; i < d; i++)
{
int x1 = xs - i;
int y1 = ys + d - i;
// Check point (x1, y1)
int x2 = xs + i;
int y2 = ys - d + i;
// Check point (x2, y2)
}
}
旧版本
假设在您的2D网格中,(0, 0)和(1, 0)之间的距离与(0, 0)和(1, 1)之间的距离相同。这个算法会起作用。该算法以螺旋方式向外搜索,从内部开始每个'环'中的每个点进行测试。
请注意,它不处理越界情况。因此,您应该根据自己的需求进行更改。
int xs, ys; // Start coordinates
if (CheckPoint(xs, ys) == true)
{
return (xs, ys);
}
for (int d = 0; d<maxDistance; d++)
{
for (int x = xs-d; x < xs+d+1; x++)
{
// Point to check: (x, ys - d) and (x, ys + d)
if (CheckPoint(x, ys - d) == true)
{
return (x, ys - d);
}
if (CheckPoint(x, ys + d) == true)
{
return (x, ys - d);
}
}
for (int y = ys-d+1; y < ys+d; y++)
{
// Point to check = (xs - d, y) and (xs + d, y)
if (CheckPoint(x, ys - d) == true)
{
return (xs - d, y);
}
if (CheckPoint(x, ys + d) == true)
{
return (xs - d, y);
}
}
}
if (CheckPoint(x, ys - d) == true)
改为 if (CheckPoint(xs - d, y))
(第一个 if
,第二个内部 for
循环);将 if (CheckPoint(x, ys + d) == true)
改为 if (CheckPoint(xs + d, y))
(第二个 if
,第二个内部 for
循环);将 return (xs - d, y)
改为 return (xs + d, y)
(第二个 return
,第二个内部 for
循环)。总之非常有趣。 - manlioDefine your two points. Point 1 at (x1, y1) and Point 2 at (x2, y2).
xd = x2-x1
yd = y2-y1
Distance = SquareRoot(xd*xd + yd*yd)
P
,创建一个指定P
周围区域的向量对。P = 4,4
那么您的向量对将是3,3|5,5
循环处理这些边界中的每个值。for x = 3 to 5
for y = 3 to 5
check(x,y)
next
next