题解 | #火车进站#
火车进站
https://www.nowcoder.com/practice/97ba57c35e9f4749826dc3befaeae109
// 思路:用next_permutation遍历所有排列,然后排除不可能的情况
// 不可能的情况:后进的出去后,之前进的不可能先进先出(栈的性质);如3 1 2和4 2 3 1
// 主要是没有编程难度,思维难度也低
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void print_list(vector<int>& list) {
for (const auto& i : list) {
cout << i << ' ';
}
cout << endl;
}
int main() {
int num;
cin >> num;
vector<int> trains;
vector<int> trains_index;
for (int i = 0; i < num; i++) {
int temp;
cin >> temp;
trains.push_back(temp);
trains_index.push_back(i);
}
vector<vector<int>> res;
vector<int> res_row(num);
do {
bool flag = true;
for (int i = 0; i < num - 2; i++) {
if (!flag) break;
int min_train = num + 1;
for (int j = i + 1; j < num; j++) {
// 比trains_index[i]大的不计入排序(之后进的不管)
if (trains_index[j] < trains_index[i]) {
// 如果存在增序列则该情况不能实现
if (min_train > trains_index[j]) {
min_train = trains_index[j];
}
else {
flag = false;
break;
}
}
}
}
if (flag) {
for (int i = 0; i < num; i++) {
res_row[i] = trains[trains_index[i]];
}
res.push_back(res_row);
}
} while (next_permutation(trains_index.begin(), trains_index.end()));
sort(res.begin(), res.end());
for (vector<int>& row : res) {
print_list(row);
}
return 0;
}
// 64 位输出请用 printf("%lld")
