参照楼上大佬的题解思路做修改:所有火车进出站都是由多步操作组合完成,而每步操作只有两种可能,要么只进站,要么只出站,然后继续递归,递归完成后恢复操作前的现场即可。
#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;
} 
京公网安备 11010502036488号