题解 | #火车进站#全排列+栈

火车进站

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")

全部评论

相关推荐

07-11 11:15
中南大学 Java
好可爱的hr姐姐哈哈哈哈
黑皮白袜臭脚体育生:兄弟们貂蝉在一起,吕布开了
点赞 评论 收藏
分享
07-02 22:46
门头沟学院 Java
码农索隆:hr:“管你投没投,先挂了再说”
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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