我的意思是:
假设我们有 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/