トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
No.113 宝探し
■■■問題■■■
A君は宝の地図を手に入れました。
地図には公園があり公園の中心に目印が書いてありました。
そして、そこからの移動方法が書いてありました。
書いてある文字に対応する移動方法は次のようになります。
●「N」は北に1メートル移動する。
●「E」は東に1メートル移動する。
●「W」は西に1メートル移動する。
●「S」は南に1メートル移動する。
例えば、「NE」と書いてあるなら北に1メートル歩いたのち東に1メートル歩きます。
その地点を掘れば宝が出てくるようです。
しかし、A君は移動方法の無駄に気づきました。
「NE」であれば北東の方向にルート(1*1+1*1)=ルート2 メートル だけ移動すれば良さそうです。
A君は公園の中心から最短の距離で宝が埋まっている位置に移動したいです。
障害物にぶつかる可能性は無いとして、A君は何メートル移動する必要があるでしょうか?
■■■入力■■■
S
地図に書かれた文字列Sが1行で与えられる。
文字列Sの長さは1文字以上100文字以内である。
文字列は'N','E','W','S'の4文字のみから構成される。
■■■出力■■■
公園の中心から宝の埋まっている位置までの距離を1行で答えよ。絶対誤差は0.01まで許容される。
最後に改行を忘れずに。
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("NE");
//1.41421
//問題文の例と同じです
}
else if (InputPattern == "Input2") {
WillReturn.Add("EN");
//1.41421
//東に1メートル歩いたのち北に1メートル歩きます。
//結局サンプル1と同じ位置にいることになるので
//答えはサンプル1と同じです。
}
else if (InputPattern == "Input3") {
WillReturn.Add("SSSSWWW");
//5
//最終的に南に4メートル、西に3メートルの地点に移動します。
//よって、ルート(4*4 + 3*3)=5メートルとなります。
}
else if (InputPattern == "Input4") {
WillReturn.Add("ESSSSEWENWNNEWWEESSS");
//4.47214
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
string S = InputList[0];
double HeniX = 0, HeniY = 0;
HeniX += S.Count(A => A == 'E');
HeniX -= S.Count(A => A == 'W');
HeniY += S.Count(A => A == 'S');
HeniY -= S.Count(A => A == 'N');
Console.WriteLine(Math.Sqrt(HeniX * HeniX + HeniY * HeniY));
}
}
解説
三平方の定理を使ってます。