排列数组使得所有邻居都被改变

Permute Array Such That All Neighbors Are Altered

我有这个圆形数组,我需要以某种方式排列它,以便每个元素的两个相邻元素都发生变化。

示例:

1 2 3 4 5 

变成

3 1 4 2 5

限制是数组至少需要5个元素,否则不可能。

长期以来一直试图解决它,我确定它有一个名字,但我没有运气在网上找到答案。

我假设您知道 choose-permute-unchoose 解决此类问题的范例。话虽如此,在选择期间你需要做的是当你选择时确保你没有选择邻居所以例如你当前的排列是 1 2 3 4 5 即你当前的字符串是 1,其余的是 2 3 4 5 . 现在你必须从 2 3 4 5 中选择,但是你当前的字符串有 1,所以你不应该选择 2。你应该选择 3。等等。

这其实很容易解决,你只需要找到一些对数组中的奇数和偶数个元素都有效的策略:

先选所有偶数,然后选第一个奇数,再选最后一个奇数,最后选其余奇数。

12345 变为 13524,因此它适用于奇数个元素。

123456 变为 135264,因此它适用于偶数个元素。

0123456789 变成 0246819357,另一个例子。