杭电1022火车问题

#include <iostream>  
#include <stack>  
#include <vector>  
#include <sstream>  
using namespace std;

int main() {
    string line;
    // 循环读取每一行输入,直到文件末尾  
    while (getline(cin, line)) {
        stringstream ss(line);
        int n;
        string o1, o2;
        // 从输入行中解析出火车数量n和进出顺序字符串o1, o2  
        ss >> n >> o1 >> o2;

        vector<int> inOrder(n), outOrder(n);
        // 将进出顺序字符串转换为整数数组  
        for (int i = 0; i < n; ++i) {
            inOrder[i] = o1[i] - '0';
            outOrder[i] = o2[i] - '0';
        }

        stack<int> railway;
        vector<string> result;
        bool possible = true;
        int inIndex = 0, outIndex = 0;

        // 模拟火车进出过程  
        while (inIndex < n) {
            railway.push(inOrder[inIndex]);
            result.push_back("in");
            ++inIndex;

            // 当栈顶火车与出栈顺序匹配时,将其出栈  
            while (!railway.empty() && railway.top() == outOrder[outIndex]) {
                railway.pop();
                result.push_back("out");
                ++outIndex;
            }
        }

        // 如果所有火车都按照指定顺序出栈,则标记为可能  
        if (outIndex != n) {
            possible = false;
        }

        // 输出结果  
        if (possible) {
            cout << "Yes." << endl;
            for (const string& r : result) {
                cout << r << endl;
            }
        }
        else {
            cout << "No." << endl;
        }

        cout << "FINISH" << endl;
    }

    return 0;
}

代码解析:

  1. 使用getline函数循环读取每一行输入,直到文件末尾。
  2. 使用stringstream对象ss来解析每一行输入,提取出火车数量n和进出顺序字符串o1o2
  3. 将进出顺序字符串转换为整数数组inOrderoutOrder,以便后续处理。
  4. 使用栈railway来模拟火车的进出过程,以及一个字符串向量result来记录每一步操作("in"表示火车进站,"out"表示火车出站)。
  5. 使用while循环模拟火车的进出过程,直到所有火车都进站为止。
  6. 在每次循环中,首先将当前火车进站,并将其记录到result中。
  7. 然后检查栈顶火车是否与出栈顺序匹配,如果匹配则将其出栈,并记录到result中。
  8. 循环结束后,检查是否所有火车都按照指定顺序出栈,如果是则标记为可能,否则标记为不可能。
  9. 根据可能与否输出结果,并打印"FINISH"表示当前测试用例处理完毕。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值