给定长度为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
答案 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 排列不能任何这样的序列都达到了。