通过旋转和反向操作进行数组排列

时间:2017-11-23 05:13:30

标签: arrays algorithm rotation permutation reverse

给定长度为n的一维数组。是否有可能以编程方式生成所有可能的排列,只需根据需要多次应用旋转和反向操作。如果是,如何(算法)?如果不是为什么? 这里旋转可以是任何d< n,反向意味着反转整个阵列,而不仅仅是部分。 例:     数组:1,2,3,4     反向:4,3,2,1     旋转2:3,4,1,2

还给出了阵列的两个置换状态A和B.是否可以以任何顺序使用旋转和反向操作以编程方式从状态A进入状态B.如果是,如何(算法)?如果不是为什么? 例:     答:5,3,1,2,4     B:1,5,3,2,4

1 个答案:

答案 0 :(得分:1)

不,你不能。

假设您有任何旋转和反向操作序列。我们将 x 旋转为 ROT(x),反之为 REV

给定任何此类序列,您可以将其转换为等效序列,其中包含最多一个反向,然后通过应用以下规则最多旋转一次:

规则1:ROT(x),REV = REV,ROT(N-x)

例如,将 ROT(1),REV 应用于 1234 会给出 1234 - > 2341 - > 1432 REV,ROT(3)给出 1234 - > 4321 - > 1432 - 结果相同

通过应用规则1,我们可以将所有 REV 操作移至开头。

规则2:REV,REV = empty_sequence - 逆转相互取消

一旦所有 REV 开始,我们就可以应用规则2,直到最多只有一个。

规则3:ROT(x),ROT(y)= ROT(x + y%N) - 旋转添加

ROT(0)= empty_sequence

一旦所有 ROT 结束,我们可以应用规则3,直到最多只有一个。

所以......任何操作序列都等同于一个序列,最多只有一个反转,后跟最多一个非零旋转。 只有 2N 这样的序列,但有 N!排列,所以 N!-2N 排列不能任何这样的序列都达到了。