AtCoderのABC    次のABCの問題へ    前のABCの問題へ

ABC359-C Tile Distance 2


問題へのリンク


C#のソース

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static string InputPattern = "InputX";

    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();

        if (InputPattern == "Input1") {
            WillReturn.Add("5 0");
            WillReturn.Add("2 5");
            //5
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("3 1");
            WillReturn.Add("4 1");
            //0
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("2552608206527595 5411232866732612");
            WillReturn.Add("771856005518028 7206210729152763");
            //1794977862420151
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        long[] wkArr = InputList[0].Split(' ').Select(pX => long.Parse(pX)).ToArray();
        long StaX = wkArr[0];
        long StaY = wkArr[1];

        wkArr = InputList[1].Split(' ').Select(pX => long.Parse(pX)).ToArray();
        long EndX = wkArr[0];
        long EndY = wkArr[1];

        long Answer = 0;
        long YDiff = Math.Abs(StaY - EndY);
        Answer += YDiff;
        long Hex_X1 = DeriveHexX(StaX, StaY);
        long Hex_X2 = DeriveHexX(EndX, EndY);
        long XDiff = Math.Abs(Hex_X1 - Hex_X2);

        XDiff -= YDiff;
        if (XDiff > 0) {
            Answer += XDiff / 2;
        }

        Console.WriteLine(Answer);
    }

    // Hex座標でのX座標を返す
    static long DeriveHexX(long pX, long pY)
    {
        // Y座標の偶奇で場合分け
        if (pY % 2 == 0) {
            // X座標の大小で場合分け
            if (pX >= 0) {
                return pX / 2 * 2;
            }
            else {
                pX--;
                pX /= 2;
                pX *= 2;
                return pX;
            }
        }
        else {
            // X座標の大小で場合分け
            if (pX >= 1) {
                // X座標の偶奇で場合分け
                if (pX % 2 == 0) {
                    return pX - 1;
                }
                else {
                    return pX;
                }
            }
            else {
                // X座標の偶奇で場合分け
                if (pX % 2 == 0) {
                    return pX - 1;
                }
                else {
                    return pX;
                }
            }
        }
    }
}


解説

ネクタリスのファルコの移動距離を意識しつつ、
Hex座標での、所属するX座標とY座標の差で計算してます。