![](/img/trans.png)
[英]generate a list of all possible combinations and randomly select a combination from the list
[英]Algorithm to get permutation from an index from the hypothetical list of all combinations?
这是我的意思:
假设我们有颜色X数量和16个正方形的4×4网格,我们可以使用任何颜色颜色的任何正方形的。
假设你可以生成所有可能的配置的列表和算法吐出出来后,另一个( 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编号。我们也将正方形从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
。 删除空格,就可以进行映射。
要使用不同数量的颜色,请使用不同的底色。 不同大小的网格将导致编码数字中的数字位数不同。
您应该可以从该提示中获得帮助。 我不会编写与您的工作= P相匹配的c ++实现,并且我认为您应该能够做到。 唯一的技术难题是处理任意基数。
正如我在评论中所说,生成配置的每种算法都可以创建将配置转换为整数(反之亦然)的包装器。
最简单和通用的解决方案是这样的:
config_t GetConfig(size_t index)
{
Generator gen;
for(size_t i = 0; i < index; ++i) gen.GetNextConfig();
return gen.GetNextConfig();
}
size_t GetIndex(const config_t & conf)
{
size_t ret = 0;
Generator gen;
while(gen.GetNext() != conf) ++ret;
return ret;
}
这显然不是一种非常有效的方法,但是它表明这是可能的。 如果您需要更有效地执行此操作,则可能不得不牺牲通用性,并专门针对一个生成器实施它。 @ luk32的答案为您提供了一个非常简单的生成器的实现方式,但是当然可以有更复杂的生成器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.