第十三届蓝桥杯python B组 E 蜂巢 题解

第十三届蓝桥杯python B组 E 蜂巢 题解_第1张图片

首先看着到这道题,只能沿着六个方向走,即六个角度,所以可以联想到数学中的极坐标。六个方向即角度,通过极坐标我们可以得到直角坐标系下的(x,y)的坐标。利用两个坐标点就可以求出两个点之间的x方向距离,和y方向的距离。

根据题意,最短路径其实很容易就可以看出是B点先沿着方向4走2个,再向方向三走5个距离(不唯一)。而它斜着走的方向夹角为30度根据勾股定理,可以求出斜边和另一条直角边的距离,之后就可以求出最短距离。

第十三届蓝桥杯python B组 E 蜂巢 题解_第2张图片

但此时应该分为两种情况,第一种情况,即题目中的这种情况, y * math.sqrt(3) / 3 <= x。另一条直角边小于x方向的距离。第二种情况是它大于,此时为这种情况。

第十三届蓝桥杯python B组 E 蜂巢 题解_第3张图片

最短路径即红色线的距离。此时我们同样可以先让最下面那个点走到和上面的点在竖直的线上,利用这水平的蓝色的边即两个坐标x之间的距离,可以算出另一条竖直的直角边和应该走的路程即红色斜边。之后两个点的y减去蓝色竖直直角边。观察可知此时这个点距离目标点的距离为绿色线条的倍数其路径为橙色线条,利用数学知识可以求出有几个绿色线条,即对应几个橙色线条,每个橙色线条对应两步。之后即可求出最短路径。  由于乘除及根号,存在误差,可采用round保留小数的部分忽略极小误差。

第十三届蓝桥杯python B组 E 蜂巢 题解_第4张图片第十三届蓝桥杯python B组 E 蜂巢 题解_第5张图片

import math
d1, p1, q1, d2, p2, q2 = [int(i) for i in input().strip().split(' ')]
k = [math.pi, 2 * math.pi / 3, math.pi / 3, 0, 5 * math.pi / 3, 4 * math.pi / 3]
# 两个点坐标
x1, y1 = p1 * math.cos(k[d1]) + q1 * math.cos(k[(d1 + 2) % 6]), p1 * math.sin(k[d1]) + q1 * math.sin(k[(d1 + 2) % 6])
x2, y2 = p2 * math.cos(k[d2]) + q2 * math.cos(k[(d2 + 2) % 6]), p2 * math.sin(k[d2]) + q2 * math.sin(k[(d2 + 2) % 6])
# 两个点x方向和y方向距离
x = abs(x1 - x2) 
y = abs(y1 - y2)

if y * math.sqrt(3) / 3 <= x:  # 两种情况
    b = y * 2 * math.sqrt(3) / 3
    x = x - y * math.sqrt(3) / 3
    print(int(round(x,2) + round(b,2)))
else:
    b = 2 * x
    y = y - b*math.sqrt(3)/2
    print(int(round(2*y/(3/math.sqrt(3)), 2) + round(b, 2)))

你可能感兴趣的:(蓝桥杯,蓝桥杯,python)