1 条题解

  • 0
    @ 2025-8-24 23:14:59

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 海洋守卫者
    不积跬步,无以至千里;不积小流,无以成江海。

    搬运于2025-08-24 23:14:59,当前版本为作者最后更新于2025-04-28 16:31:22,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    P12367 [蓝桥杯 2022 省 Python B] 蜂巢

    解题思路

    容易发现蜂巢间的移动可以看作向量,因此可以构建下图坐标系:

    所以,正西方向可以看作为 (1,0)(-1,0),西偏北 6060^\circ 可以看作为 (0,1)(0,1),东偏北 6060^\circ 可以看作为 (1,1)(1,1),正东可以看作为 (0,1)(0,1),表示东偏南 6060^\circ 可以看作为 (0,1)(0,-1),西偏南 6060^\circ 可以看作为 (1,1)(-1,-1)

    接着就能够计算出从定点 (d1,p1,q1)(d_1, p_1, q_1) 到点 (d2,p2,q2)(d_2, p_2, q_2) 的向量 P1P2\overrightarrow{P_1P_2},记为 (x,y)(x,y)。然后求出答案。

    此时还应当判断 xxyy 的符号。若为同号,可以先在 (1,1)(1,1) 方向上移动,答案为 max{x,y}\max\{|x|,|y|\};若为异号,则答案为 x+y|x|+|y|

    完整代码

    C++:

    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    const int dt[8][4]={{-1,0},{0,1},{1,1},{1,0},{0,-1},{-1,-1}};
    int a,b,c,d,e,f;
    inline int p(int d)
    {
    	return (d+2)%6;
    }
    int main()
    {
    	scanf("%d %d %d %d %d %d",&a,&b,&c,&d,&e,&f);
    	int x=0,y=0,ans;
    	x=dt[a][0]*b+dt[p(a)][0]*c-dt[d][0]*e-dt[p(d)][0]*f;
    	y=dt[a][1]*b+dt[p(a)][1]*c-dt[d][1]*e-dt[p(d)][1]*f;
    	if((x>0&&y>0)||(x<0&&y<0))ans=max(abs(x),abs(y));
    	else ans=abs(x)+abs(y);
    	printf("%d",ans);
    	return 0;
    }
    

    Python:

    def p(x):
    	return (x+2)%6
    dt=((-1,0),(0,1),(1,1),(1,0),(0,-1),(-1,-1))
    a,b,c,d,e,f=map(int,input().split())
    x=dt[a][0]*b+dt[p(a)][0]*c-dt[d][0]*e-dt[p(d)][0]*f
    y=dt[a][1]*b+dt[p(a)][1]*c-dt[d][1]*e-dt[p(d)][1]*f
    ans=0
    if x*y>0:
    	ans=max(abs(x),abs(y))
    else:
    	ans=abs(x)+abs(y)
    print(ans)
    
    • 1

    信息

    ID
    12189
    时间
    1000ms
    内存
    512MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者