ブロックの問題
説明は :(英語)は、直接の翻訳には、言うことはありません
最初は左から右への木材の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を(); }