ポット
直接中国に
説明:
あなたの二つの容器、保持できる水の各リットルとBのプレミアムを付けて、次の操作を行うことができます
(I)容器が蛇口からi番目(1≤iは2以下)が充填されているFILL。
排出i番目の容器にDROP(I)
POUR(i、j)はj番目の容器への水のi番目の容器(運転終了後の結果の二種類は、j番目の一方とi番目の容器充填容器は依然として第二、残存していますi番目のすべての水は、i番目のコンテナ内のコンテナjの中に注ぎ入れ)空であります
今、それらのいずれかが、水の容器が、操作の最小数を見つけ、C-リットルを持っていることを起こることができます見つけるためにプログラムを書くことをお願いして操作を提供します
入力
一つだけの行であって、ある3つの数字のA、B、C(1 <= A、B <= 100、C <= MAX(A、B))
出力
最初の行は、Kは、操作の最小数を表す数値が含まれてい
操作の最小数、それらのいずれかの操作の出力を満たすために、複数回答があるかどうかあなたが作ることができない場合は、任意の二つの容器が正確にC Lを満たすそして、Kラインは、それぞれが、特定の操作を与え、出力 " 「不可能
サンプル入力
3 5 4
サンプル出力
6 FILL(2) から(2,1) DROP(1) から(2.1) FILL(2) から(2.1)
トピックリンク:
https://vjudge.net/problem/POJ-3414
BFSプライオリティキューは、チームへの議論はコメントを注意して、両方の問題への具体的な解決策のコード上で、6例で、OKです
書式#include <iostreamの> の#include <cstdioを> する#include <fstreamの> の#include <アルゴリズム> 書式#include <cmath> の#include <両端キュー> の#include <ベクトル> の#include <キュー> の#include < 文字列 > の#include <CStringの> 書式#include <マップ> 書式#include <スタック> の#include < 設定 > 書式#include <sstream提供> #define MOD 1000000007件 の#define EPS 1E-6 の#defineっ長い長い の#define INF 0x3f3f3f3f #define ME0(X)のmemset(X、0、はsizeof(x))を 使用して 名前空間STD; int型A、B、C、 INTフラグ=で0 ; // 初期化失敗 INT合計= 0 ; // 合計操作を数回それは、各ステップの添え字である int型 ID [ 105 * 105 ]; // 正しいパスインデックスを保存 INT VIS [ 105 ] [ 105 ]; // かエンキュースルーフラグ状態 チャー OP [] [ 10 ] = { " 0 "、" FILL(1)"、「(2)FILL" " (1)DROP " " DROP(2)" " (1,2)POURは" " (2,1)POUR " }; // 最後の出力 構造体ノード { INT NO; // この場合標準 INT K1、K2; // 水性残りカップ int型の OPを; // 操作 のintステップ; // ステップの数は int型プリ; // 前のステップインデックス BOOLの 演算子 <(constのノードC&)CONST // 少ない工程数最初のアウトチーム { 戻り工程> c.step; } }; PRIORITY_QUEUE <ノード> Q; ノード今、次に、 ベクトル <ノード> V; ボイドプリント(INT I)// 出力形式 { INT J = 0 ; 一方、(V [I]・NO) { ID [Jは ++] = V [I]は.NO; // 正しいパス添字を格納 I = V [I] .PRE; } ため(J-I = 1 ; I> = 0 ; I - )// 操作のインデックス出力 { COUT<< OP [V [ID [I]] OP] << ENDL。 } } ボイドBFS() { now.k1 = 0、now.k2 = 0、now.op = 0、now.pre = 0、now.step = 0、now.no = 0 。 VIS [now.k1] [now.k2] = 1 。 q.push(今)。 (今)v.push_back。 しばらく(!q.empty()) { 今 = q.top(); q.pop(); もし(now.k1 == C || now.k2 == C)// 满足条件 { フラグ = 1; coutの << now.step <<てendl; // 输出步数 の印刷(now.no)。// 输出格式 破ります。 } のために(int型 i = 1 ; iは= < 6 ; iが++ ) { 場合(I == 1)// (1)充填 { next.k1 = 。 next.k2 = now.k2。 } そう なら(I == 2)//は(2)充填 { next.k1 =をnow.k1; next.k2 = B。 } そう なら(I == 3)// ドロップ(1) { next.k1 = 0 。 next.k2 = now.k2。 } そう なら(I == 4)// ドロップ(2)。 { next.k1 = now.k1。 next.k2 = 0 ; } それ以外の 場合(I == 5)//(1,2)を注ぐ { IF(+ now.k2 now.k1 <= B)// 我々はBを満たすことができない場合 { next.k1 = 0 ; next.k2 = now.k1 + now.k2; } 他の // あなたはBを埋めることができた場合は { next.k1 = now.k1 now.k2- + ; B next.k2 = ; B } } 他の IF(I == 6。 )// 注ぐ(2,1) { IF(Now.k1 + now.k2 <= A)// 我々が満たすことができない場合は 、{ next.k1 = now.k1 + now.k2; next.k2 = 0 ; } そう //を使用すると、Bを満たすことができる場合 { Nextを.k1 = A; next.k2 = now.k1 now.k2- + A; } } next.op = I; IF(!VIS [next.k1] [next.k2]) { 合計 ++; next.no C。 = 総。 VIS [next.k1] [next.k2] = 1 。 next.step = now.step + 1 。 next.pre = now.no。 v.push_back(次) q.push(次) } } } 場合(フラグ== 0 ) COUT << " 不可能" << ENDL。 } int型のmain() { ME0(VIS)。 CIN >> A >> B >> BFS(); }