代码之家  ›  专栏  ›  技术社区  ›  A Y

通过旋转和反向操作进行数组置换

  •  2
  • A Y  · 技术社区  · 7 年前

    给定长度为n的1D数组。是否可以通过编程生成所有可能的置换,只需根据需要多次应用旋转和反转操作。如果是,如何(algo)?如果不是,为什么? 这里的旋转可以通过任何d<n、 反转是指反转整个阵列,而不仅仅是部分阵列。 例子: 反转:4,3,2,1 旋转2:3,4,1,2

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   Matt Timmermans    7 年前

    不,你不能。

    假设您有任何旋转和反转操作序列。我们将写旋转 x 并反转为 修订版 .

    给定任何此类序列,您可以应用以下规则将其转换为最多由一个反转和最多一个旋转组成的等效序列:

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

    例如,应用 ROT(1),版本 1234 给予 1234->2341->1432 给予 1234->4321->1432 --同样的结果

    通过应用规则1,我们可以移动所有 修订版 从操作开始。

    规则2:REV,REV=empty\u序列 --反转相互抵消

    一旦所有 修订版 在一开始,我们可以应用规则2,直到最多有一个。

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

    而且

    ROT(0)=空_序列

    一旦所有 腐烂

    所以任何操作序列都相当于一个序列,该序列最多有一个反转,然后最多有一个非零旋转。 只有 2N 这样的序列 N 排列,所以 N-2N 任何这样的序列都无法实现置换。