1. 程式人生 > 實用技巧 >AcWing 129 火車進棧(模擬,dfs)

AcWing 129 火車進棧(模擬,dfs)

題目連結

解題思路

  火車進棧一共有兩種狀態,一種是後面的火車車廂進棧,一種是前面的火車出棧。可以發現,如果後面的車廂進棧了,因為先進先出,而他的編號較大,那麼他出棧的形成的序列的字典序就一定比先讓棧中的火車出棧要大。
  所以說如果要輸出字典序最大的序列,應該優先讓前面的火車出棧,然後再讓後面的火車進棧。最後用回溯法模擬所有的情況。

程式碼

int n, cnt = 20;
stack<int> sk;
vector<int> res;
void dfs(int p) {
    if (!cnt) return;
    if (res.size()==n) {
        --cnt;
        for (auto num : res) cout << num;
        cout << endl;
        return;
    }
    if (!sk.empty()) {
        res.push_back(sk.top());
        sk.pop();
        dfs(p);
        sk.push(res.back());
        res.pop_back();
    }
    if (p<=n) {
        sk.push(p);
        dfs(p+1);
        sk.pop();
    }
}
int main() {
    cin >> n;
    dfs(1);
    return 0;
}