全排列+检验出栈序列是否合法/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")

全部评论

相关推荐

03-03 23:42
复旦大学 Java
_无论云泥意贯一:把复旦大学放前面,山东大学放后面,并且在两个大学后面标注985(用一些显眼的颜色标注)
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务