试题E:蜂巢 ——蓝桥杯第十三届省赛Java 大学A组

试题E:蜂巢

在这里插入图片描述

解析

很明显的一道坐标计算问题,只是通过看似比较复杂的描述而已。
题目定义了一种行走方向,大概就是一共六种行走方向,如果以o为原点,建立坐标系,那么方向03就是x轴。其他方向为分力即可,如1就是(-0.5,0.5)2就是(0.5,0.5),然后计算步数就好了。

  • 模拟行走路径,然后拆分为我们定义的坐标
  • 通过两点坐标,计算步数
    f ( w , x , y , z ) = a b s ( w − x ) + a b s ( y − z ) f(w,x,y,z)=abs(w-x) + abs(y-z) f(w,x,y,z)=abs(wx)+abs(yz)

证明:
对于正六边形而言,每个夹角都为120°,那么如图:
在这里插入图片描述
连接三个正六边形中心的线段长都一样并且设为1则边际线切分为两半为0.5,刚好距离计算从黄到灰为0.5+0.5=1

代码

package com.maggot.maggotscheduler.bootstrap.utils.lanqiaobei13;

/**
 * @author huangyichun
 */
public class E蜂巢 {
    public static void main(String[] args) {
        XY B = getxy(0, 5, 3);
        XY C = getxy(2, 3, 2);
        System.out.println(B);
        System.out.println(C);
        System.out.println("B.getFarFrom(C) = " + B.getFarFrom(C));
    }


    public static XY getxy(int d, double p, double q) {
        switch (d) {
            case 0:
                return new XY(-p + q / 2, 0 + q / 2);
            case 1:
                return new XY(-p / 2 + q, p / 2);
            case 2:
                return new XY(p / 2 + q / 2, p / 2 - q / 2);
            case 3:
                return new XY(p - q / 2, 0 - q / 2);
            case 4:
                return new XY(p / 2 - q, -p / 2);
            case 5:
                return new XY(-p / 2 - q / 2, -p / 2 + q / 2);
            default:
                return new XY(0, 0);
        }
    }


    private static class XY {
        double x;
        double y;

        public XY(double x, double y) {
            this.x = x;
            this.y = y;
        }

        public double getFarFrom(XY other) {
            return Math.abs(x - other.x) + Math.abs(y - other.y);
        }

        @Override
        public String toString() {
            return "XY{" +
                    "x=" + x +
                    ", y=" + y +
                    '}';
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值