参照楼上大佬的题解思路做修改:所有火车进出站都是由多步操作组合完成,而每步操作只有两种可能,要么只进站,要么只出站,然后继续递归,递归完成后恢复操作前的现场即可。
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;


void work(vector<int> train,vector<int> out,vector<int> in,set<vector<int>> &res,int k) {
	if (out.size() == train.size()) {
		res.insert(out);
		return;
	}

	if (!in.empty()) {//只出站不进站
		out.push_back(*(in.end()-1));//已出站火车序列添加一辆
		in.pop_back();//站内火车删除一辆
		work(train,out,in,res,k);//剩余的继续递归
		in.push_back(*(out.end() - 1));//恢复现场
		out.pop_back();//恢复现场
	}

	if (k != train.size()) {//只进站不出站
		in.push_back(train[k]);//站内火车添加一辆
		k++;//剩余火车位置后移
		work(train, out, in, res, k);//剩余的继续递归
		in.pop_back();//恢复现场

	}


}


int main() {
	int n;
	while (cin >> n)
	{
		vector<int> train(n);//待入栈的车
		for (int i = 0; i < n; i++)
			cin >> train[i];
		vector<int> in;//站内的车
		vector<int> out;//已经出站的车
		set<vector<int>> res;//set具备排序作用
		work(train, out, in, res, 0);
		for (auto iter = res.begin(); iter != res.end(); ++iter)
		{
			for (int i = 0; i < n; i++)
			{
				cout << (*iter)[i] << " ";
			}
			cout << endl;
		}
	}

	return 0;
}