Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Chương trình C++ triển khai Prev_Permutation trong STL

std::prev_permutation sắp xếp lại các phần tử trong phạm vi [first, last) thành hoán vị ngược về mặt từ điển (lexicographically smaller) ngay trước hoán vị hiện tại. Hàm trả về true nếu hoán vị trước đó tồn tại, ngược lại trả về false và biến phạm vi thành hoán vị cuối cùng (giảm dần).

Thuật toán

  1. Nhập số phần tử và các giá trị.
  2. Sắp xếp mảng tăng dần.
  3. Đảo ngược mảng để bắt đầu từ hoán vị lớn nhất (giảm dần).
  4. Lặp: hiển thị mảng hiện tại, sau đó gọi prev_permutation cho đến khi trả về false.

Ví dụ mã

#include <iostream>
#include <algorithm>
using namespace std;

void show(int a[], int n) {
    for (int i = 0; i < n; ++i)
        cout << a[i] << " ";
    cout << endl;
}

int main() {
    int e;
    cout << "Nhập số phần tử: ";
    cin >> e;
    int elements[e];

    for (int i = 0; i < e; ++i) {
        cout << "Phần tử " << i + 1 << ": ";
        cin >> elements[i];
    }

    sort(elements, elements + e);
    reverse(elements, elements + e);

    cout << "Tất cả " << e << "! hoán vị giảm dần:\n";
    do {
        show(elements, e);
    } while (prev_permutation(elements, elements + e));

    return 0;
}

Kết quả mẫu (n=4, giá trị 7,6,10,2)

10 7 6 2
10 7 2 6
10 6 7 2
10 6 2 7
10 2 7 6
10 2 6 7
7 10 6 2
7 10 2 6
7 6 10 2
7 6 2 10
7 2 10 6
7 2 6 10
6 10 7 2
6 10 2 7
6 7 10 2
6 7 2 10
6 2 10 7
6 2 7 10
2 10 7 6
2 10 6 7
2 7 10 6
2 7 6 10
2 6 10 7
2 6 7 10