1-4電車の発送(25分)(できません)

    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;
}

おすすめ

転載: blog.csdn.net/weixin_45845039/article/details/108816993