(六)排列Permutation-组合Combination

1. 排列

1.1 std::next_permutation

使用STL的std::next_permutation函数

void PermutationTest()
{
    string s = "abc";
    cout << s << endl;
    while (std::next_permutation(s.begin(), s.end())){
        cout << s << endl;
    }
}

1.2 递归+回溯

参考:

算法思路:
(1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀);
(2)出口:如果只有一个元素的全排列,则说明已经排完,则输出数组;
(3)不断将每个元素放作第一个元素,然后将这个元素作为前缀,并将其余元素继续全排列,等到出口,出口出去后还需要还原数组;

void Permutation(int first, int last, vector<int> &v)
{
    if (first == last){
        for (auto e : v){
            cout << e << " ";
        }
        cout << endl;
        return;
    }

    for (int i = first; i <= last; ++i){
        Swap(first, i, v);
        Permutation(first + 1, last, v);
        Swap(first, i, v);
    }
}

void PermutationTest()
{
    vector<int> v = { 1, 2, 3, 4, 5 };
    Permutation(0, 4, v);
}

2. 组合

2.1 STL的next_permutation函数

void CombinationTest()
{
    std::vector<int> v = { 1, 2, 3, 4, 5, 6, 7 };
    std::vector<int> selector = { 0, 0, 0, 0, 1, 1, 1 };
    int count = 0;
    do{
        cout << ++count << ": ";
        for (int i = 0; i < v.size(); ++i){
            if (selector[i] == 1){
                cout << v[i] << " ";
            }
        }
        cout << endl;
    } while (next_permutation(selector.begin(), selector.end()));
}

2.2 递归

参考:

void Combination(const std::vector<int> &v, int n, int m, std::vector<int> &result)
{
    if (m == 0){
        std::for_each(result.begin(), result.end(), [](int a){std::cout << a << " "; });
        std::cout << endl;
        return;
    }

    for (int i = n; i >= m; --i){
        result.push_back(v[i - 1]);
        Combination(v, i - 1, m - 1, result);
        result.pop_back();
    }
}

void CombinationTest()
{
    const std::vector<int> v = { 1, 2, 3, 4, 5 };
    int n = 5;
    int m = 3;
    std::vector<int> result;
    Combination(v, n, m, result);
}
posted @ 2018-10-25 16:42  yvhqbat  阅读(238)  评论(0编辑  收藏  举报