HUSTOJ 进阶题组1 问题 B 火车进站问题

文章讨论了如何根据给定的火车进站序列O1和目标出站序列O2,判断是否能实现从O1到O2的转换。通过使用栈和队列数据结构进行操作,分析火车的进站和出站顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

假设杭州东火车站只有一条铁路,并且所有火车都从一侧进来,从另一侧出去。那么,如果火车A先进站,然后火车B在火车A离开之前就进站,那么火车A直到火车B离开后才能离开,可参见下图。

现在,假设车站中有n(n<=9)列火车,所有火车都有一个ID(从1到n的编号),火车以O1的顺序进站,您的任务是确定火车是否可以按O2顺序出站。

输入

输入包含几个测试用例。

每个测试用例均包含三部分:一个表示火车数量的整数和两个字符串O1和O2,其中,火车的进站顺序用O1串表示,火车的出站顺序用O2串表示。

输入在文件末尾终止,更多信息参见样例。

输出

如果不能从O1的入站顺序得到O2的出站顺序,请输出字符串“ No.”。

如果能够得到,则请输出"Yes."
然后输出进站和出站的具体方式(“in”表示火车进站,“out”表示火车出站)。
在每个测试用例之后输出一行“ FINISH”。

更多信息参见样例。

样例输入 Copy
3 123 321
3 123 312
样例输出 Copy
Yes.
in
in
in
out
out
out
FINISH
No.
FINISH

#include<iostream>
#include<stack>
#include<queue>
using namespace std;
 
int main()
{
    int train_number;
    while (cin >> train_number) {
        string o1, o2;
        cin >> o1 >> o2;
 
        queue<char> q1, q2;
        stack<char> st;
        vector<string> v;
 
        for (int i = 0; i < train_number; i++) {
            q1.push(o1[i]);
            q2.push(o2[i]);
        }
         
        while (q1.empty() == false) {
 
            if (st.empty() == false && st.top() == q2.front()) {
                v.push_back("out");
                st.pop();
                q2.pop();
                continue;
            }
 
            char ch = q1.front();
            if (ch == q2.front()) {
                q1.pop();
                q2.pop();
                v.push_back("in");
                v.push_back("out");
            }
            else {
                v.push_back("in");
                st.push(ch);
                q1.pop();
            }
        }
 
        while (st.empty() == false && st.top() == q2.front()) {
            st.pop();
            q2.pop();
            v.push_back("out");
        }
 
        if (st.empty() == false) {
            cout << "No." << endl;
        }
        else {
            cout << "Yes." << endl;
            int len = v.size();
            for (int i = 0; i < len; i++) {
                cout << v[i] << endl;
            }
        }
        cout << "FINISH" << endl;
    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值