全排列+检验出栈序列是否合法/C++
火车进站
https://www.nowcoder.com/practice/97ba57c35e9f4749826dc3befaeae109
/*
使用回溯字典序地产生全排列,验证是否是可行的出栈序列
*/
#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
bool isValidStack(vector<int> & trains,vector<int>& track){//给定入栈序列,检验出栈序列是否合法
stack<int> st;
int p = 0;
for(int train:trains){
st.push(train);
while(st.size()!= 0 && st.top() == track[p]){
st.pop();
p++;
}
}
return st.size() == 0;
}
//全排列
void backtrack(vector<int> & trains, vector<int>& track,vector<int>& used, vector<vector<int> > & ans){
//输出结果
if(track.size() == trains.size() && isValidStack(trains, track)){
ans.push_back(track);
return;
}
for(int i = 0; i < trains.size(); i++){
if(used[i] == 0){
track.push_back(trains[i]);
used[i] = 1;
backtrack(trains, track, used, ans);
used[i] = 0;
track.pop_back();
}
}
}
//使用回溯进行全排列
void showTrains(vector<int> & trains){
// sort(trains.begin(), trains.end());//不是车牌按字典序,是结果按字典序排序
int len = trains.size();
vector<int> track;
vector<int> used(trains.size(),0);
vector<vector<int> > ans;
backtrack(trains, track,used, ans);
//按照字典序输出结果
sort(ans.begin(), ans.end());
for(int i = 0; i < ans.size(); i++){
for(int j = 0; j <len-1; j++){
cout<<ans[i][j]<<" ";
}
cout<<ans[i][len-1]<<endl;
}
}
int main() {
int n;
while(cin>>n) {
vector<int> trains(n,0);
for(int i = 0; i < n; i++){
cin>>trains[i];
}
showTrains(trains);
}
}
// 64 位输出请用 printf("%lld")
查看16道真题和解析