题解 | #火车进站#

火车进站

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

全部评论

相关推荐

07-01 19:00
门头沟学院 Java
点赞 评论 收藏
分享
鬼迹人途:你去投一投尚游游戏,服务器一面,第一个图算法,做完了给你一个策略题,你给出方案他就提出低概率问题,答不上当场给你挂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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