結果

問題 No.48 ロボットの操縦
ユーザー velfare_nagatavelfare_nagata
提出日時 2016-10-04 10:18:41
言語 C#(csc)
(csc 3.9.0)
結果
AC  
実行時間 24 ms / 5,000 ms
コード長 3,210 bytes
コンパイル時間 1,276 ms
コンパイル使用メモリ 107,008 KB
実行使用メモリ 17,920 KB
最終ジャッジ日時 2024-11-21 18:55:39
合計ジャッジ時間 2,705 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 22 ms
17,792 KB
testcase_01 AC 23 ms
17,664 KB
testcase_02 AC 23 ms
17,792 KB
testcase_03 AC 23 ms
17,408 KB
testcase_04 AC 23 ms
17,664 KB
testcase_05 AC 23 ms
17,664 KB
testcase_06 AC 22 ms
17,792 KB
testcase_07 AC 23 ms
17,664 KB
testcase_08 AC 23 ms
17,792 KB
testcase_09 AC 23 ms
17,664 KB
testcase_10 AC 23 ms
17,920 KB
testcase_11 AC 22 ms
17,664 KB
testcase_12 AC 24 ms
17,664 KB
testcase_13 AC 22 ms
17,792 KB
testcase_14 AC 22 ms
17,536 KB
testcase_15 AC 23 ms
17,536 KB
testcase_16 AC 24 ms
17,792 KB
testcase_17 AC 23 ms
17,664 KB
testcase_18 AC 23 ms
17,408 KB
testcase_19 AC 23 ms
17,792 KB
testcase_20 AC 24 ms
17,664 KB
testcase_21 AC 24 ms
17,408 KB
testcase_22 AC 22 ms
17,664 KB
testcase_23 AC 23 ms
17,792 KB
testcase_24 AC 24 ms
17,792 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
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)の座標に移動させたいと思っている。
		/// 
		/// ロボットに出来る命令は、1回につき以下のうちいずれかの命令を選んで指示することができる。
		/// ・時計回りに、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 = "0";
			//var line2 = "-1";
			//var line3 = "1000000000";
			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 == 0 ) != ( (int)nextDir % 2 == 0 ) )
					return 1;
				else
					return 2;
			} );
			var getMoveCount = new Func<int, int, int>( ( pos, nextPos ) =>
			{
				var differ = Math.Abs( nextPos - pos );
				return ( differ / l ) + ( ( differ % l == 0 ) ? 0 : 1 );
			} );

			// 向き変更を最小限に抑える順番
			// ①↑ ②(←、→) ③↓
			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 isPositive = ( nextDir > 0 );
				var nowPos = isX ? nowX : nowY;
				var nextPos = isX ? x : y;

				// 移動する必要がない場合は処理しない
				if( nowPos == nextPos )
					continue;
				// 対応する向きへの計算が不要の場合も処理しない
				if( isPositive && nowPos > nextPos )
					continue;
				if( !isPositive && nowPos < nextPos )
					continue;

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

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

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