火车进站题目解析
火车进站
http://www.nowcoder.com/questionTerminal/97ba57c35e9f4749826dc3befaeae109
题目解析:
我看题目的第一眼,理解是1 2 3都进去了,然后都出来了,突然2号车又回来了,先进站,然后到1号车回来了,1进站,最后3进站,这样出站顺序一定有3 1 2了。但是答案不是这样的>_<,只能从答案反推题目完整题意。
题目漏了一个关键的条件:火车站内只有1条铁轨!另外输入数据中的第二行指定了进站顺序,这样所有火车就不能想进站就进站了,要听铁路局指挥安排!所以不能用排列公式直接计算C(3, 3),只能依次猜测出站的真正可能性,所以初始条件是1 2 3这个顺序就很重要了。
2020.11.8修正:
之前理解不够完善,实际上题目中的火车站内只有1根铁轨,但火车站外有多根铁轨(不然的话整个铁轨就是一条直线了,火车顺序永远只有一种了,这不符合题意),且必须只能按照给定的顺序进站,比如示例1,只能按照1 2 3的顺序进站,意即一定是1号车先进站。但是题目没有规定1出站的时间点,1可以在2进站之后,等2出站了再出站;也可以在2进站之前先出站,这样第1个出站的一定是1号车,顺序必定是1 x x。
所以用穷举列出示例1的所有情形:
1单独先进出的情况,有两种:
1先进站,再出站,然后2进站,3进站,3出战,2出站,出站顺序:1 3 2
1先进站,再出站,然后2进站,2出战,3进站,3出站,出站顺序:1 2 3
1 2先进站,然后2先出站的情况,也有两种:
1先进站,2进站,然后2出站,1出站,3进站,3出站。出站顺序:2 1 3
1先进站,2进站,然后2出站,3进站,3出战,1出站。出站顺序:2 3 1
1 2 3依次全部进站的情况,只能依次出站,只有一种:
1先进站,2进站,3进站,3出站,2出站,1出站。出站顺序:3 2 1
只要满足一点:进站顺序必须满足输入数据的第二行,即永远是1 2 3!
作为火车调度员,每次操作要么入站,要么出站,很明显,我们用递归就可以穷举出所有可能性:
// 火车进站
#include <iostream>
#include <vector>
#include <stack>
#include <deque>
#include <algorithm>
using namespace std;
vector<vector <int>> answer;
// 火车调度函数,每次调度只有两种情况:进站或出站
void schedule(deque<int> & in, vector<int> & out, stack<int> & station)
{
if (in.empty() && station.empty()) {
answer.push_back(out);
return;
}
//进站分支,注意进站分支和出站分支是独立的,因为schedule是递归函数!
if (!in.empty()) {
// 保护现场
auto temp = in.front();
// 进站
station.push(in.front());
in.pop_front();
schedule(in, out, station);
// 还原现场
in.push_front(temp);
station.pop();
}
//出站分支,注意进站分支和出站分支是独立的,因为schedule是递归函数!
if (!station.empty()) {
// 保护现场
auto temp = station.top();
//出站
out.push_back(station.top());
station.pop();
schedule(in, out, station);
// 还原现场
out.pop_back();
station.push(temp);
}
}
int main()
{
auto n = 0; //火车数量
auto train_num = 0; //火车编号
while (cin >> n) {
stack<int> station; // 站内火车栈表
deque<int> in; // 等待进站火车队列
vector<int> out; // 已出站火车队列
for (auto i = n; i > 0; i--) {
cin >> train_num;
in.push_back(train_num);
}
schedule(in, out, station);
sort(answer.begin(), answer.end());
for (auto &i : answer) {
for (auto &j : i) {
cout << j << " ";
}
cout << endl;
}
answer.clear();
}
return 0;
}
查看12道真题和解析
