排列枚舉

罕見

簡介

排列枚舉也是一種常見的枚舉技巧,主要用途就是枚舉一個陣列的所有可能的排列方式。在這個技巧中,我們會使用 C++ 的 next_permutation 函式,這個函式可以幫助我們找到下一個排列。

實作方式

在 C++ 中,我們可以使用 next_permutation 函式來找到下一個排列。

sort(v.begin(), v.end());
// 枚舉 v 的所有排列
do {
    for (int i = 0; i < v.size(); i++) {
        cout << v[i] << " ";
    }
    cout << endl;
} while (next_permutation(v.begin(), v.end()));
注意

這邊實作上,有幾個比較需要注意的點:

  • 由於 next_permutation 是幫我們找到字典序更大的下一個排序,因此我們需要先將陣列升序排序好,next_permutation 函式才能正確運作。
  • 這個函式會將目前的排列變成下一個排列,如果已經是最後一個排列,則會回傳 false
補充

除了 next_permutation 之外,C++ 還有一個函式叫做 prev_permutation,可以用來找到上一個排列,使用方式和 next_permutation 差不多,不過比較少用到。