結果

問題 No.48 ロボットの操縦
ユーザー velfare_nagatavelfare_nagata
提出日時 2016-10-04 10:02:09
言語 C#(csc)
(csc 3.9.0)
結果
WA  
実行時間 -
コード長 2,979 bytes
コンパイル時間 1,572 ms
コンパイル使用メモリ 112,048 KB
実行使用メモリ 26,032 KB
最終ジャッジ日時 2024-05-01 11:31:20
合計ジャッジ時間 7,536 ms
ジャッジサーバーID
(参考情報)
judge5 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 20 ms
23,740 KB
testcase_01 AC 20 ms
25,848 KB
testcase_02 WA -
testcase_03 WA -
testcase_04 AC 20 ms
21,816 KB
testcase_05 AC 20 ms
25,720 KB
testcase_06 AC 20 ms
23,808 KB
testcase_07 AC 21 ms
23,856 KB
testcase_08 WA -
testcase_09 AC 20 ms
23,996 KB
testcase_10 WA -
testcase_11 AC 20 ms
25,980 KB
testcase_12 AC 21 ms
23,724 KB
testcase_13 AC 21 ms
23,724 KB
testcase_14 AC 21 ms
21,816 KB
testcase_15 AC 21 ms
25,856 KB
testcase_16 AC 20 ms
25,996 KB
testcase_17 AC 19 ms
23,872 KB
testcase_18 WA -
testcase_19 AC 21 ms
23,984 KB
testcase_20 AC 20 ms
23,984 KB
testcase_21 AC 19 ms
23,868 KB
testcase_22 WA -
testcase_23 AC 20 ms
23,856 KB
testcase_24 WA -
権限があれば一括ダウンロードができます
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc)
Copyright (C) Microsoft Corporation. All rights reserved.

ソースコード

diff #

using System;
using System.Diagnostics;

namespace CodeIq
{
	internal class Program
	{
		/// <summary>
		/// 太郎君はロボットを遠隔で操縦している。
		/// 
		/// このロボットは現在(0,0)の座標に立っていて北の方向を向いている。
		/// 太郎君はいまこのロボットを(X,Y)の座標に移動させたいと思っている。
		/// 
		/// ロボットに出来る命令は、11回につき以下のうちいずれかの命令を選んで指示することができる。
		/// ・時計回りに、90∘ その場で向き(進行方向)を変える。
		/// ・反時計回りに、90∘ その場で向き(進行方向)を変える。
		/// ・向いている方向に K距離だけ前進する。Kは、(1≤K≤L) の範囲で、命令のたびに指定することができる。
		/// </summary>
		private static void Main()
		{
			// パラメータ取得
			var line1 = Console.ReadLine();
			var line2 = Console.ReadLine();
			var line3 = Console.ReadLine();
			//var line1 = "-7";
			//var line2 = "15";
			//var line3 = "7";
			if( string.IsNullOrEmpty( line1 ) )
				return;
			if( string.IsNullOrEmpty( line2 ) )
				return;
			if( string.IsNullOrEmpty( line3 ) )
				return;

			var x = int.Parse( line1 );
			var y = int.Parse( line2 );
			var l = int.Parse( line3 );

			var nowX = 0;
			var nowY = 0;
			var nowDir = Direction.North;
			var orderCount = 0;

			var getRedirectCount = new Func<Direction, Direction, int>( ( dir, nextDir ) =>
			{
				if( dir == nextDir )
					return 0;
				else if( ( (int)dir % 2 ) != ( (int)nextDir % 2 ) )
					return 1;
				else
					return 2;
			} );
			var getMoveCount = new Func<int, int, int>( ( pos, nextPos ) =>
			{
				var addValue = ( pos < nextPos ) ? 1 : -1;
				var moveCount = 0;
				while( pos != nextPos )
				{
					moveCount++;
					if( Math.Abs( nextPos - pos ) > l )
						pos += addValue * l;
					else
						pos = nextPos;
				}
				return moveCount;
			} );

			// 向き変更を最小限に抑える順番
			// ①↑ ②(←、→) ③↓
			var nextDirections = new Direction[3];
			nextDirections[0] = Direction.North;
			nextDirections[1] = ( nowX < x ) ? Direction.West : Direction.East;
			nextDirections[2] = Direction.South;

			foreach( var nextDir in nextDirections )
			{
				var isX = ( (int)nextDir % 2 == 0 );
				var nowPos = isX ? nowX : nowY;
				var nextPos = isX ? x : y;
				if( nowPos == nextPos )
					continue;

				orderCount += getRedirectCount( nowDir, nextDir );
				nowDir = Direction.North;
				orderCount += getMoveCount( nowPos, nextPos );
				if( isX )
					nowX = x;
				else
					nowY = y;
			}

			Debug.Print( orderCount.ToString() );
			Console.WriteLine( orderCount );
		}

		/// <summary>
		/// 向きを表す列挙体<br />
		/// 奇数値の場合はY軸方向、偶数値の場合はX軸方向
		/// </summary>
		public enum Direction
		{
			North = 1,
			West = 2,
			South = 3,
			East = 4
		}
	}
}
0