具有固定样本空间的置换算法

时间:2018-04-06 08:02:38

标签: c++ permutation

我有10个对象(n)我想要一个C ++代码,它只能在5个空格中打印这10个对象的所有排列,而不是对象的整个排列,例如在大小为5的数组中。

1 个答案:

答案 0 :(得分:1)

这是一些伪代码,它创建5个元素的每个子集并置换它:

for z1 = 1:6
    for z2 = (z1+1):7
        for z3 = (z2+1):8
            for z4 = (z3+1):9
                for z5 = (z4+1):10
                    subset = [set[z1], set[z2], set[z3], set[z4], set[z5]]
                    for i = 1:(5!)
                        print(subset)
                        subset = next_permutation(subset)
                    end
                end
            end
        end
    end
end

这是一个示例代码

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> set {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    for (int z1 = 0; z1 < 6; ++z1) {
        for (int z2 = z1 + 1; z2 < 7; ++z2) {
            for (int z3 = z2 + 1; z3 < 8; ++z3) {
                for (int z4 = z3 + 1; z4 < 9; ++z4) {
                    for (int z5 = z4 + 1; z5 < 10; ++z5) {
                        std::vector<int> subset {set[z1], set[z2], set[z3], set[z4], set[z5]};
                        for (int i = 0; i < 120; ++i) {
                            for (int j = 0; j < 5; ++j) 
                                std::cout << subset[j] << " ";
                            std::cout << std::endl;
                            std::next_permutation(subset.begin(), subset.end());
                        }
                    }
                }
            }
        }
    }
    return 0;
}

您可以使用递归函数代替5个循环来使代码动态化。