【UVA - 101】ブロック問題(ベクター+模拟)

ブロックの問題

説明は :(英語)は、直接の翻訳には、言うことはありません

最初は左から右への木材のn個の部分がありますが、以下の4つの操作を達成するために必要な、0〜N-1の番号が付け:

  • Bに移動:その後の裏面全体にわたってブロックと初期位置のB、及びトップBに
  • バック全ての元の位置へのブロックの先頭を、次いで、木ここで、Bのヒープの上に:B上を移動
  • 元の位置にブロックのBの上部を、次いで、上記bに上記のすべての全体のブロック:Bの上に重ね
  • B上パイルA:A、スタックの最上位のブロックB全てブロック全体上記

データのセットの終わりをマークする(同じパイルにおけるAおよびB)不当命令があった場合、「終了」、それは無視されるべきであるれます。

エントリー

スタート入力整数から始まるnは、整数によってライン、世界でビルディングブロックの数を表します。あなたは0 <N <25をとることができます。ビルディング・ブロックの次の行番号値の先頭からの個別の行に一連のコマンド、それぞれです。あなたのプログラムは、入力exitコマンドまで、すべてのコマンドに対処する必要があります。あなたは、すべてのコマンドは、上記のような形式で与えられていると仮定することができます。コマンド構文エラーは発生しません。

輸出

出力として、世界のビルディングブロックの最終ステータス。各元のビルディングブロック位置I(0≤iが<nで、 nはブロックの数である)後にコロンが続くされます。
その位置で少なくとも一つのビルディングブロックは、コロン、スペースと、この位置の全てのビルディングブロックのシーケンス番号が続かなければならない場合。数字の2つのブロックのそれぞれの間にスペースがあります。余分なスペースが表示されることができない行の終わり。別々のライン位置の各ビルディングブロック(すなわち、n入力の最初の行は、n個の出力データ線に対応します)。
サンプル入力

10 
移動9 1上に
8 1上を移動する
1上を移動7 
1上を移動6 
6上パイル8 
5上パイル8 
1上を移動する2 
9上を移動する4 
終了

サンプル出力

0:0

1:1 9 2 4

2:

3:3

4:

5:5 8 7 6

6:

7:

8:

9:

トピックへのリンク:https://vjudge.net/problem/UVA-101

 

彼らはそれぞれの山に木のいくつかの作品を知らないので、質問の意味に従って、再びそれをシミュレートし、あなたは、ベクターを使用することができます

ACコード

書式#include <iostreamの> 
の#include <cstdioを> 
する#include <fstreamの> 
の#include <アルゴリズム> 
書式#include <cmath> 
の#include <両端キュー> 
の#include <ベクトル> 
の#include <キュー> 
の#include < 文字列 > 
の#include <CStringの> 
書式#include <マップ> 
書式#include <スタック> 
の#include < 設定 > 
書式#include <sstream提供>
 に#define MOD 1000000007
 の#define LL長い長い
 の#define 0x3f3f3f3f INF
 の#defineME0(X)のmemset(X、0、はsizeof(x))を
 使用して 名前空間STD; 
ベクター < INT > V [ 30 ];
 int型N-;
 // 、場所を見つけるの高
空隙 FindBlock(INT A、INT&P、INT&H)// P、Hアドレスを返し
{
     ため(P = 0 ; P <N-、P ++ のための(H = 0 ; H <V [P] .size(); H ++ IF(V [P] [ H] == A)
                 リターン; 
} 
// 還元のP-H番目のブロック上記ヒープ
ボイドMoveBack(INT P、INT H)
{ 
    ためint型 IがH +を= 1 ; Iは、V [P] .sizeを()<; Iは++ 
    { 
        int型 T = V [P] [I]、
        V [T] .push_back(T ); 
    } 
    V [P] .resize(H + 1 ); 
} 
// ヒープは、P2の移動阻止するために、H1のP1を含む
ボイド MoveOn(INT P1、INT H1、int型のP2)
{ 
    ためINTを = IのH1; Iは、V [P1] .sizeを()<; Iは++ 
    { 
        V [P2] .push_back(V [P1] [I]); 
    }
    V [P1] .resize(H1)。
} 
// 输出格式
ボイドCoutを()
{ 
    ためint型 i = 0 ; iがn <; iは++ 
    { 
        のprintf(" %のD:" 、I)。
        INT J = 0 J ++; J <V [I] .size() 
        { 
            のprintf(" %dの" 、V [i]は[J])。
        } 
        COUT << ENDL。
    } 
} 
int型のmain()
{ 
    CIN >> N。
    以下のための int型I = 0 ; 私は、n <; I ++ 
        V [i]は.push_back(I)。
    int型、B;
    文字列S1、S2;
    しばらく(CIN >> S1)
    { 
        場合(S1 == " 終了" ブレイク
        CIN >> A >> S2 >> B;
        int型のPA、PB、HA、HB; 
        FindBlock(PA、HA)。
        FindBlock(B、PB、HB)。
        もし(PAの==のPB)
             続けますもし(S1 == " 移動" 
            MoveBack(PA、HA); 
        もし(S2 == " " 
            MoveBack(PB、HB)。
        MoveOn(PA、HA、PB)。
    } 
    Coutを(); 
}

 

おすすめ

転載: www.cnblogs.com/sky-stars/p/10988706.html