結果
| 問題 |
No.3 ビットすごろく
|
| コンテスト | |
| ユーザー |
velfare_nagata
|
| 提出日時 | 2016-10-05 11:35:55 |
| 言語 | C#(csc) (csc 3.9.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,372 bytes |
| コンパイル時間 | 4,591 ms |
| コンパイル使用メモリ | 111,376 KB |
| 実行使用メモリ | 28,984 KB |
| 最終ジャッジ日時 | 2024-11-21 17:16:44 |
| 合計ジャッジ時間 | 4,589 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 18 WA * 15 |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System;
using System.Collections;
using System.Diagnostics;
namespace CodeIq
{
internal class Program
{
/// <summary>各数値に対応するビットフラグ数のテーブル</summary>
private static Hashtable _bitCountTable;
/// <summary>
/// Carol は特殊なすごろくをしようとしている。
///
/// 1からNの番号がふられている一直線に並べられているN個のマスがある。
/// 1から開始のマスとして、ゴールはNが書かれているマスとする。
///
/// その場に書かれている数字の2進数で表現した時の1のビット数 だけ「前」または「後」に進めることができる。
/// (1未満とN+1以上のマスには移動することは出来ない、正確にNにならないとゴールできない)
///
/// 自然数Nを与えられた時、ゴールに到達できる最短の移動数(開始のマスへも移動にカウントする)を求めてください。
/// 到達できない場合は-1を出力してください。
///
/// 開始のマスがすでにゴールになっている場合もあリます。
/// </summary>
private static void Main()
{
var n = int.Parse( Console.ReadLine() );
//var n = 1333;
var moveCount = 1;
var finished = false;
var stack = new Stack();
var history = new Stack();
stack.Push( 1 );
history.Push( 1 );
var getBitCount = new Func<int, int>( target =>
{
var bitCount = 0;
for( ; target > 0; target &= target - 1 )
bitCount++;
return bitCount;
} );
_bitCountTable = new Hashtable();
for( var i = 1; i < n; i++ )
_bitCountTable[i] = getBitCount( i );
// ゴールまでの経路を計算する
while( stack.Count > 0 )
{
var pos = (int)stack.Pop();
if( pos == n )
{
finished = true;
break;
}
moveCount++;
var backward = pos - (int)_bitCountTable[pos];
if( !history.Contains( backward ) && backward > 0 )
{
stack.Push( backward );
history.Push( backward );
}
var forward = pos + (int)_bitCountTable[pos];
if( !history.Contains( forward ) && forward <= n )
{
stack.Push( forward );
history.Push( forward );
}
}
Debug.Print( ( finished ? moveCount : -1 ).ToString() );
Console.WriteLine( finished ? moveCount : -1 );
}
}
}
velfare_nagata