蓝桥题库2134——蜂巢超级详解

首先可以看到题目中分出了六个方向,建立了一个新的坐标系。但我们可以将其重新构建成一个常见的x,y直角坐标系。注:虽然题目中对于斜线的方向角度为60度,但我们为了方便理解使用,将其当作是45度也就是直角坐标系的斜线

建立了如图的坐标系,以中心的六边形的中心为原点,以边的一半为一个单位1建立。,然后题中每次移动都会导致直角坐标系中的x,y的改变和为2.

例如原题目中坐标为(0,5,3)则在直角坐标系中,先向西前进两个单位五次,然后向东偏北前进根2个单位3次。最终换算出的x,y坐标为(-7,3)

同理(2,3,2)换算后是(5,1)

然后计算两点间的x,y的差值的绝对值,通过math.h头文件中的llabs()函数求绝对值

然后我们可以计算两点间最少位移次数了,我们可以发现横移的话是x轴坐标加改变,斜着移动是x,y各改变1。所以如果x>y的话,说明除了斜着走带来的x轴的改变还有横着走额外带了的x轴坐标的改变,如果dx=dy则说明只需斜着走就好。所以如果dx=(x的差值)>=dy(y的差值),则需要(dx+dy)除以2来得到最少移动数,反之如果dx<dy,例如图中两黑点,说明需要斜着走dy次。

然后最终代码实现为

#include <stdio.h>
#include <stdlib.h>
#include<math.h>
typedef long long ll;
ll xdir[10] = { -2,-1,1,2,1,-1 };
ll ydir[10] = { 0,1,1,0,-1,-1 };
ll x1 = 0, sb = 0, x2 = 0, y2 = 0;
void walkk(ll d, ll p, ll q, ll* x, ll* y)
{
    *x += xdir[d] * p + xdir[(d + 2) % 6] * q;
   *y += ydir[d] * p + ydir[(d + 2) % 6] * q;
}
int main()
{
    ll d1, p1, q1, d2, p2, q2;
    scanf("%lld%lld%lld%lld%lld%lld", &d1, &p1, &q1, &d2, &p2, &q2);
    walkk(d1, p1, q1, &x1, &sb);
    walkk(d2, p2, q2, &x2, &y2);
    ll dx = llabs(x1 - x2);
   ll dy = llabs(sb-y2);
   printf("%lld%lld ", x2, y2);
    if (dx >= dy)
        printf("%lld", (dx + dy)/ 2);
    else
    printf("%lld", (dx+dy)/2);
    return 0;
}

注意这里不能设置变量为y1因为在math.h中有一个函数名为y1,导致我提交错误好几次,气得我设置变量名改为了sb......

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值