3

假设我们有一组从 (0,0,0) 到 (100,100,100) 的 3D(整数)坐标,我们希望访问每个可能的坐标(要访问的 100^3 个可能的坐标),而不需要多次访问每个坐标。

相邻步骤中每个坐标的差之和不能大于2(不知道有没有可能,如果没有,则最小化)例如从(0,2,1)到(2, 0,0) 的总差值为 5,因为 |x1-x2|+|y1-y2|+|z1-z2| = 5

我们如何生成这样的坐标序列?

例如,开始: (0,0,0) (0,0,1) (0,1,0) (1,0,0) (1,0,1) (0,0,2) (0 ,1,1) (0,2,0) (1,1,0) (2,0,0) (3,0,0) (2,0,1) (1,0,2) (0, 0,3) 等等...

任何人都知道一种算法,它将生成这样一个序列到任意坐标(x,y,z),其中 x=y=z 或者可以证明这样的算法不可能存在?谢谢

额外功劳:展示如何使用 x!=y!=z 生成这样的序列:D

4

3 回答 3

4

技巧之一(还有其他方法)是一次做一条线[segment],一次做一个平面[square]。解决问题的最后一部分,这种方法有效,即使访问的卷的大小在每个维度上都不相同(例如:100 x 6 x 33 块)。

换句话说:

从 (0,0,0) 开始,
仅在 Z 轴上移动直到段的末尾,即
(0,0,1), (0,0,2), (0,0,3), ... (0,0,100),
然后移动到下一行,即
(0,1,100)
并向后在线,即
(0,1,99), (0,1,98), (0,1,97), ... (0,1,0),
在下一行旁边,“前进”

并重复直到整个“面板被绘制”,即结束于
... (0,100,99), (0,100,100),
然后,最后,在 X 轴上移动 1,即
(1,100,100)
 并在另一个面板上重复,但在这个面板上“向上”
等等

本质上,每一步都是在一个维度上完成的,恰好是一个维度。这有点像您在 101 x 101 x 101 的建筑物中从一个房间“走”到另一个房间,其中每个房间都可以通向给定轴上直接相邻的任何房间(即不会沿对角线连接)。

在编程语言中实现这种逻辑是微不足道的!唯一具有轻微挑战性的部分是处理“来回”,即有时,给定维度中的一些变化是积极的,有时是消极的)。

编辑:(希德关于做同样的对角线的问题):
是的!这很有可能,因为问题表明我们可以有两个 [Manhattan] 距离,这是对角线所需要的。
路径将类似于上面列出的路径,即来回走线(仅此处为可变长度的线),然后移动到第三维中的下一个“面板”,并重复,仅“向上” “ ETC。

(0,0,0) (0,0,1)
(0,1,0) 第一个对角线,长度只有 1。
(0,2,0) “转身”
(0,1,1) (0,0,2) 第二对角线:长度为 2
(0,0,3) “转身”
(0,1,2) (0,2,1) (0,3,0) 第三对角线:长度为 3
(0,4,0) 转身
等等

确实可以混合和匹配这些方法,无论是在完整的“面板”级别,例如对角线和下一个水平线,以及在给定面板内,例如从对角线开始,但是当打开时顶线,继续水平模式,在“左侧”循环时只需稍早停止,因为该侧的一部分已用对角线处理。
实际上,这允许相当多(但显然是有限的)“绘制”整个空间的方法。关键是要避免留下(太多)未涂漆的相邻区域,因为回到它们可能会使我们陷入死胡同,或者可能需要超过 2 次的“跳跃”。

于 2009-11-22T07:00:03.177 回答
0

也许您可以概括格雷码,这似乎解决了问题的特殊情况。

于 2009-11-22T06:52:54.643 回答
0

一开始看起来很琐碎,但一旦开始,它就很棘手!特别是步骤可以是 1 或 2。
这不是一个答案,而是更多地演示特定序列的前 10 多个步骤,希望可以帮助其他人进行可视化。Sid,如果以下内容有误,请告诉我:

s = 上一个坐标的步数
c1 = 条件 1 (x = y = z)
c2 = 条件 2 (x!= y!= z)
(x,y,z) s c1 c2
---------------
(0,0,0) * (开始)
(0,0,1) 1
(0,1,0) 2
(1,0,0) 2
(1,0,1) 1
(1,1,0) 2
(1,1,1) 1 *
(2,1,1) 1
(2,0,1) 1 *
(2,0,0) 1
(2,1,0) 1 *
(2,2,0) 1
(2,2,1) 1
(2,2,2) 1 *
(2,3,2) 1
(2,3,3) 1
(3,3,3) 1 *
(3,3,1) 2
(3,2,1) 1 *
(3,2,0) 1 *
  .
  .
  .
于 2009-11-22T06:59:24.347 回答