技巧之一(还有其他方法)是一次做一条线[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 次的“跳跃”。