【问题标题】:Generate all unique combinations of 0-9 for X amount of digits [duplicate]为X位数生成0-9的所有唯一组合[重复]
【发布时间】:2018-11-25 12:00:36
【问题描述】:

我无法想出逻辑来为 X 位数生成所有可能的 0-9 唯一组合。

例如,如果我想要总共 5 位数字的所有唯一组合,它将使用 0-9 生成它们。 (01234、01235等)

如果您对我的问题有任何简单而有创意的解决方案,我很想听听。我必须在 MASM 中实现它,但任何使用 C++ 的解决方案都应该不是问题。

【问题讨论】:

  • 组合还是排列?也许您正在寻找std::next_permutation?
  • @Sani:哦,等等,Generating permutations of a set (most efficiently) 是 permutations,这里的 OP 要求 combinations。所以不是完全相同的副本,但它确实具有可以在 asm 中实现的 next_permutation 的显式算法。我没有足够详细地研究这个问题,但 Jarod 的答案似乎是一种在给定排列算法的情况下获得组合的方法。 (IDK,如果我应该立即重新打开它,或者让它编辑到另一个 dup 目标中;对不起,我第一次应该更仔细地阅读。)
  • @Richard:也找到了组合部分的副本。打印每个 sorted 排列就可以了,通过排列真/假值来完成。您可能希望使用字节数组而不是打包位图来实现它(如实际的vector<bool>)。然后,如果您想以有趣的方式进行操作,请将该位图与 SSSE3 pshufb 或 bmi2 pdep 一起使用以将整数左包。如果您有一台具有 BMI2 的机器,也许您可​​以将 AVX2 what is the most efficient way to pack left based on a mask? 用于字节而不是 32 位 int。否则使用标量循环!

标签: c++ assembly masm masm32


【解决方案1】:

在 C++ 中,你可以使用类似的东西:

template <typename T>
void Combination(const std::vector<T>& v, std::size_t count)
{
    assert(count <= v.size());
    std::vector<bool> bitset(v.size() - count, 0);
    bitset.resize(v.size(), 1);

    do {
        for (std::size_t i = 0; i != v.size(); ++i) {
            if (bitset[i]) {
                std::cout << v[i] << " ";
            }
        }
        std::cout << std::endl;
    } while (std::next_permutation(bitset.begin(), bitset.end()));
}

Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    相关资源
    最近更新 更多