这是蓝桥杯2022年Python的G题,其实这道题我在很久之前看到时被劝退,感觉自己写不出来,今天重新来挑战他,发现这道题没有运用任何变成知识,仅仅运用了直角坐标系(笛卡尔坐标系)。

看到这一题的第一眼肯定不会将他和坐标系联系在一起,第一想到的时DFS和BFS这种搜索算法,但是很可惜,这道题没有这么深。

解题思路

思路

根据图中显示,我们可以发现,从原点O(0, 0)出发,左上、左下、右上、右下,这4个方向每移动一次x +- 0.5, y +- 1

而向左或者向右只有 x +- 1

根据这个想法可以得出[[-1, 0], [-0.5, 1], [0.5, 1], [1, 0], [0.5, -1], [-0.5, -1]],下标从0开始,每个下标都对应着蜂巢的6个方向。

按照题目给的要求得到点B和点C

计算两点之间的距离,两点之间的路径就是abs(x1 - x2) + abs(y1 - y2)由于蜂巢向上向下移动一次是 ± 0.5,所以得到最终的表达式为abs(x1 - x2) + abs(y1 - y2) * 0.5

若一个点向上向下移动能直接抵达另一个点,那么直接输出abs(y1- y2) * 0.5

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import math

# 0, 1, 2, 3, 4, 5
directions = [[-1, 0], [-0.5, 1], [0.5, 1], [1, 0], [0.5, -1], [-0.5, -1]]


def position(d, p, q):
pos_x = pos_y = 0
pos_x += (directions[d][0] * p) + (directions[(d + 2) % 6][0] * q)
pos_y += (directions[d][1] * p) + (directions[(d + 2) % 6][1] * q)
return pos_x, pos_y


arr = list(map(int, input().split()))
d1, p1, q1 = arr[:3]
d2, p2, q2 = arr[3:]

B = position(d1, p1, q1)
C = position(d2, p2, q2)

x = abs(B[0] - C[0])
y = abs(B[1] - C[1])

if y * 0.5 >= x:
print(int(y))
else:
print(int(x + y * 0.5))