题解 | #火车进站#全排列+栈
火车进站
https://www.nowcoder.com/practice/97ba57c35e9f4749826dc3befaeae109
#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
bool checkValid(vector<int>& vec, vector<int>& candidate) {
stack<int> stack;
int i = 0, j = 0;
while (j < candidate.size()) {
while (!stack.empty() && stack.top() == candidate[j]) {
stack.pop();
j++;
}
if (j >= vec.size()) {
return true;
}
if (i >= vec.size()) {
break;
}
stack.push(vec[i++]);
}
return false;
};
void dfs(vector<vector<int>>& res, vector<int>& vec, vector<bool>& used,
vector<int> candidate) {
if (candidate.size() == vec.size()) {
if (checkValid(vec, candidate)) {
res.push_back(candidate);
}
return;
}
for (int i = 0; i < vec.size(); i++) {
if (used[i] == true) {
continue;
}
used[i] = true;
candidate.push_back(vec[i]);
dfs(res, vec, used, candidate);
candidate.pop_back();
used[i] = false;
}
}
int main() {
int a;
cin >> a;
vector<int> vec(a);
for (int i = 0; i < a; i++) {
cin >> vec[i];
}
// 全排列所有的出栈顺序,然后判断出栈顺序是否有效
vector<vector<int>> res;
vector<bool> used(a, false);
vector<int> candidate;
dfs(res, vec, used, candidate);
std::sort(res.begin(), res.end());
for (int i = 0; i < res.size(); i++) {
for (int j = 0; j < res[i].size(); j++) {
cout << res[i][j] << " ";
}
cout << endl;
}
}
// 64 位输出请用 printf("%lld")
查看6道真题和解析
