繁体   English   中英

从所有组合的假设列表中的索引中获取置换的算法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM