2

我想生成 n 个数字的排列,其中没有两个排列是相互反转的(从最后一个字符读取到第一个字符的第一个与第二个相同)。例如,n = 3,我想生成:

1 2 3 //but not 3 2 1
1 3 2 //but not 2 3 1
2 1 3 //but not 3 1 2

我不在乎将生成两者中的哪一个。该算法应适用于较大的 n (>20)。有没有这样的算法或方法来检查生成的排列是否是先前生成的排列的镜像?

4

2 回答 2

8

使用std::next_permutation并忽略第一个元素大于最后一个元素的排列。

于 2013-09-29T18:22:54.813 回答
1

不,到目前为止,通过通常的硬件和软件,您无法做到这一点,因为这种排列的数量是 20!/2 > 10^10 * 2^20,这意味着您需要很多年才能生成它们。

于 2013-09-29T18:25:08.043 回答