1 ====== <--移动方向
/
3 =====
\
2 ====== -->移动方向
一部のデータ構造の教科書で「列車のスケジューリングの問題」を見たことがあるかもしれません(もちろん、見ていなくても問題ありません)。本日は実際に電車の発送を行います。上記のASCII文字マップと比較すると、問題は次のように説明されています。
3つの平行な列車トラック(1、2、3)と2つの接続トラック1-3および2-3があります。1番トラックに電車が停車しています。2本の接続トラックと3番トラックを使用して、必要な順番で2番トラックに乗り換えてください。ルールは次のとおりです。
一度に1台の車
が転送されます。トラック1の車は、1-3リンクからトラック3に入る(この操作は「1-> 3」として記録されます)か、2つの接続トラックからトラック2に直接入ります(この操作は「1-> 3」として記録されます)。この操作は「1-> 2」として記録されます。
車が2番トラックに入ると、トラックから移動することはできません
。3番トラックの車は、2-3リンクを介してのみ2番トラックに入ることができます(この操作)。 「3-> 2」として記録されます);
明らかに、どのキャリッジも他のキャリッジを通過、横断、またはバイパスすることはできません。
所定のパーキングシーケンスNo.1について、スケジューリング後にNo. 2トラックに必要なシーケンスを達成できる場合は、操作シーケンスが示されます。そうでない場合は、ユーザーに「冗談ですか(はい)」と尋ねられます。 ?
入力形式:
大文字で構成された空でない文字列の2行1行目は1番トラックに駐車した車の左から右への順序を示し、2行目は2番トラックに駐車した車の入力順序を示します(例1のCBAの2行目を入力して、トラック2に駐車した車が左から右にABCであることを示します。これは、Cが最初に入るので、右端にあるためです)。2つの文字列の長さは同じで、26を超えません(大文字が26文字しかないため)。各文字はキャリッジを表します。タイトルは、同じ行の文字が繰り返されず、2行の文字セットが同じであることを保証します。
出力形式:
正常にスケジュールできる場合は、最短の操作シーケンスが与えられ、各操作は1行を占めます。いわゆる「最短」とは、1-> 2でスケジューリングを完了できる場合、1-> 3および3-> 2では達成できないことを意味します。スケジュールできない場合は、「冗談ですか?」と出力します。
入力例1:
ABC
CBA
出力例1:
1-> 3
1-> 3
1-> 2
3-> 2
3-> 2
入力例2:
ABC
CAB
出力例2:
私をからかってるの?
それについて話さないでください、私はこの種の問題を知りません、私は理由を知りません、私は非常に混乱しています、悲しいかな、このコードとコピーアンドペーストの違いは何ですか?。しかし、私はそれを意味する何かを得ることができ、それは動的プログラミングのように感じます(私は理解していません、私は始めることができません...)
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
//不会做,看不懂这种题,参考着写的,理解点意思了
int main(){
string s,ss;
cin >> s >> ss;
stack<char> s1,s2,s3;
vector<int> v;
for(int i = s.length()-1;i>=0;i--){
s1.push(s[i]);
}
for(int i = ss.length()-1;i>=0;i--){
s2.push(ss[i]);
}
while(!s2.empty()){
if(!s1.empty()&&s1.top()==s2.top()){
s1.pop();
s2.pop();
v.push_back(1);
}
else if(!s3.empty()&&s2.top()==s3.top()){
s2.pop();
s3.pop();
v.push_back(2);
}
else if(s1.empty()&&!s2.empty()&&s2.top()!=s3.top()){
cout << "Are you kidding me?" << endl;
return 0;
}
else{
s3.push(s1.top());
s1.pop();
v.push_back(3);
}
}
for(int i = 0;i<v.size();i++){
if(v[i]==1)
cout << "1->2" << endl;
else if(v[i]==2)
cout << "3->2" << endl;
else
cout << "1->3" << endl;
}
return 0;
}