トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
No.208 王将
■■■問題■■■
将棋の王将の駒は8方向に1マス移動できる。
(0,0)にいる時は、(-1,1),(0,1),(1,1),(-1,0),(1,0),(-1,-1),(0,-1),(1,-1)のいずれかに移動できる。
今、王将が(0,0)のマスにいる。
一刻も早く(x,y)のマスに移動したい。
しかし、味方の歩兵が(x2,y2)にいて邪魔になっている。
(0,0)から(x,y)に移動する最短手数を求めよ。
ただし、歩兵を動かすことは出来ない。
この将棋盤は無限に大きく、負の座標のマスも存在する。
■■■入力■■■
x y
x2 y2
0 <= x,y,x2,y2 <= 10億
(0,0),(x,y),(x2,y2)は全て異なる。
■■■出力■■■
(x,y)までの最短手数を出力せよ。
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "Input1";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("1 1");
WillReturn.Add("1 0");
//1
}
else if (InputPattern == "Input2") {
WillReturn.Add("10 1");
WillReturn.Add("1 0");
//10
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] wkArr = { };
Action<string> SplitAct = (pStr) =>
wkArr = pStr.Split(' ').Select(X => int.Parse(X)).ToArray();
SplitAct(InputList[0]);
int GoalX = wkArr[0], GoalY = wkArr[1];
SplitAct(InputList[1]);
int HuX = wkArr[0], HuY = wkArr[1];
int Tesuu = Math.Max(GoalX, GoalY);
//迂回が必要かを判定
if (GoalX == GoalY && HuX == HuY && HuX < GoalX)
Tesuu++;
Console.WriteLine(Tesuu);
}
}
解説
迂回の1手が必要なのは、目的マスのX座標とY座標が等しくて、
(0,0)との直線上に、歩がいる場合となります。