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座標の差で計算してます。