解题语言不限Java
拖更了,不好意思
- Advent of Code Day 1 逆向验证码
- Advent of Code Day 2 损坏校验和
- Advent of Code Day 3 螺旋内存
- Advent of Code Day 4 高熵密码
- Advevnt of Code Day 5 曲折的蹦床迷宫
- Advent of Code Day 6 内存重分配
- Advent of Code Day 7 递归马戏团
- Advent of Code Day 8 注册表爱好者
- Advent of Code Day 9 流处理
- Advent of Code Day 10 结哈希
- Advent of Code Day 11 六边形迷宫
题目内容
Crossing the bridge, you've barely reached the other side of the stream when a program comes up to you, clearly in distress. "It's my child process," she says, "he's gotten lost in an infinite grid!"
当你快跨过桥的时候,你看见一个沮丧的程序走过来。“这是我孩子的路径”,她说,“他在这个无穷大的网格里迷路了”。
Fortunately for her, you have plenty of experience with infinite grids.
对她来说幸运的是,你对无穷网格很有经验。
Unfortunately for you, it's a hex grid.The hexagons ("hexes") in this grid are aligned such that adjacent hexes can be found to the north, northeast, southeast, south, southwest, and northwest:
对你来说不幸的是,这是个六边形网格(译者注:我把链接的网址换成百度了,方便各位没有梯子的同志们)。六边形在网格里对齐,并且可以向北,西北,西南,东北,东南移动。
\ n /
nw +--+ ne
/ \
-+ +-
\ /
sw +--+ se
/ s \
You have the path the child process took. Starting where he started, you need to determine the fewest number of steps required to reach him. (A "step" means to move from the hex you are in to any adjacent hex.)
你有她孩子走过的路径,从当前位置开始,你需要去判断到达他所在位置的最短路径。
For example:
-
ne,ne,ne
is3
steps away.
最短路径为3。 -
ne,ne,sw,sw
is0
steps away (back where you started).
最短路径为0,因为转了一圈回来了。 -
ne,ne,s,s
is2
steps away (se,se
).
最短路径为2(se,se
)。 -
se,sw,se,sw,sw
is3
steps away (s,s,sw
).
最短路径为3(s,s,sw
)。
解题思路
这个题目是要求在原点到目标点的曼哈顿距离。不知道曼哈顿距离的朋友可以去看看曼哈顿距离。
难点在于和直角坐标系相比,移动向量多了一,并且有移动向量之间是可以互相转换的。
比如说:
我用移动向量(x,y,z)来表示六边形网格中的位置。
- x是向北移动的距离
- y是向西北移动的距离
- z是向东北移动的距离
那位置(-1,1,1)和位置(0,0,0)是一样的
但是在直角坐标系中(x,y)的组合是不会出现这样的问题。因为在二维平面。垂直的两个向量是不会互相影响的。
我在犯了这个错误之后借鉴了一下这个网站,这里面很详细的讲了各种方法来解这个问题。我会在整个活动结束之后出一个学习笔记来解析这个题目。