c++ - 从所有组合的假设列表中获取索引排列的算法?

标签 c++ algorithm permutation combinatorics

我的意思是:

假设我们有 X 种颜色和一个由 16 个正方形组成的 4x4 网格,我们可以用 任何正方形着色任何颜色。

假设您可以生成所有可能配置的列表,并且算法将它们一个接一个地吐出(configuration#1,然后是 configuration#2 等等),有没有办法使用数字 i 并立即获得 configuration#i

(因为在普通硬件上不可能存储 1e+16 配置)

更重要的是,是否可以使用该算法的逆运算并为其提供一个配置,它会返回一个 i,当重新插入时会返回原始配置?像这样:

int colours[4][4] = GenerateSomeConfig(); // Gets some combination of colours
int i = GetIndex(colours); // This is the main function I was asking about
int colours2[4][4] = GetConfig(i); // This is the reverse of GetIndex()

assert(CompareGridsEqual(colours, colours2)); // This shouldn't break

最佳答案

这些是重复的组合。

无论如何。让我们稍微简化一下问题。假设我们有 10 种颜色。编号为 0 到 9。让我们也为方 block 编号,从 1 到 16(或其他数字。你说 4x4,你的代码说 16x16,但这并不重要)。

您可以使用框的颜色数。所以你最终会说:

0 9 6 3 
4 7 5 1 
0 2 1 7 
5 2 3 4

现在你可以把网格变成条纹 - 0 9 6 3 4 7 5 1 0 2 1 7 5 2 3 4。删除空格,您就有了映射。

要使用不同数量的颜色,请使用不同的基色。不同大小的网格会导致编码后的数字位数不同。

你应该能够从这个提示中脱颖而出。我不会编写一个 c++ 实现来匹配你的努力 =P,我认为你应该能够做到。唯一的技术难点是处理任意碱基的数量。

关于c++ - 从所有组合的假设列表中获取索引排列的算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30150729/

相关文章:

C++内联类方法导致 undefined reference

c++ - boost::function 如何支持不同长度模板参数的模板类

c++ - 在 C++ 中创建 Wavefront .obj 文件(网格 3D)

algorithm - 在矩阵中寻找最大的连通树

c++ - 可变参数模板 : lvalue vs rvalue references

algorithm - 我们可以使用单个数组进行图形查找和连接操作来获得对数时间复杂度吗?

algorithm - 生成二项式系数的最快方法

c++ - 下一个词法 "permutation"算法

perl - 为什么 Perl 的 Math::Combinatorics 提示 "must use next_permutation of ' 频率'参数未传递给构造函数”?

numpy - 涉及非常大的数组的问题