0

有人可以解释为什么这不起作用吗?(意味着变量 colorChange 在整个函数中保持不变)

每个数组(leftRing 和 rightRing 具有从 1 到 4 的整数值)

    Private Sub Solve_Click(sender As System.Object, e As System.EventArgs) Handles Solve.Click

    countColorChangesInRings(colorChanges)
    RotateLeftRingClockwise()
    countColorChangesInRings(colorChanges)

    End Sub

    Sub countColorChangesInRings(ByRef var As Integer)

    Dim colorChangesLeft As Integer = 0
    Dim colorChangesRight As Integer = 0
    Dim totalChanges As Integer = 0
    ' Count Color Changes in Left Ring
    For i = 1 To 20
        If (i = 20) Then
            If (leftRing(i) <> leftRing(1)) Then
                colorChangesLeft += 1
            End If
        Else
            If (leftRing(i) <> leftRing(i + 1)) Then
                colorChangesLeft += 1
            End If
        End If
    Next

    ' Count Color Changes in Right Ring
    For i = 1 To 20
        If (i = 20) Then
            If (rightRing(i) <> rightRing(1)) Then
                colorChangesRight += 1
            End If
        Else
            If (rightRing(i) <> rightRing(i + 1)) Then
                colorChangesRight += 1
            End If
        End If
    Next
    totalChanges = colorChangesLeft + colorChangesRight
    var = totalChanges
End Sub

 Sub RotateLeftRingClockwise()
    Dim temp As Integer = leftRing(1)
    ' Rotates Rings clockwise direction
    For i = 1 To 20
        If (i = 20) Then
            leftRing(i) = temp
        Else
            leftRing(i) = leftRing(i + 1)
        End If
    Next
End Sub
4

1 回答 1

1

据我所见,它将保持不变。

您基本上有一个值的循环缓冲区(由于您的特殊句柄 when i = 20),并且您计算值从索引更改为索引的次数。

如果您只是通过循环缓冲区旋转值,则该数字不会改变。

以数组为例{1, 2, 2, 2, 3, 4}。那里有四个过渡,1-22-33-44-1

如果你然后顺时针旋转列表,你会得到转换{4, 1, 2, 2, 2, 3}4-1,1-2和。2-33-4

换句话说,转换的顺序可能会改变,但数量不会改变。


根据您添加的RotateLeftRingClockwise代码,这就是您的问题所在。

因为它只是旋转左环,所以您没有正确处理匈牙利环的交点。旋转左环,以及围绕左环移动值,改变右环中的两个数组元素(反之亦然),如下图所示:

   array element 1 (in a 32-element array)
          |
      +---+---+
      |       |
      V       V
     LLL     RRR
   LL   LL RR   RR
  L       *       R      <- shared cell is left(29)/right(5)
 L       R L       R
 L       R L       R
L       R   L       R
L       R   L       R
L       R   L       R
 L       R L       R
 L       R L       R
  L       *       R      <- shared cell is left(21)/right(13)
   LL   LL RR   RR
 \   LLL     RRR   /
  \               /
   \----->>>-----/
     Direction of
       increasing
         array index

因为您的旋转代码不这样做,所以两个环的转换计数将保持相同,因此它们的总和不会改变。

例如,假设顶部中间的单元格是数组元素 1(如图所示)并且它以逆时针方向增加(因为您的代码似乎表明顺时针旋转从ring[i+1]到的事实ring[i])。

您的代码需要做的是首先旋转左环,然后将*单元格的新值强制进入右环,例如:

Sub RotateLeftRingClockwise()
    Dim temp As Integer = leftRing(1)
    For i = 1 To 19
        leftRing(i) = leftRing(i + 1)
    Next
    leftRing(20) = temp

    rightRing( 5) = leftRing(29)
    rightRing(13) = leftRing(21)
End Sub

最后两行中的那些数组索引特定于我上面的图表(32 个单元格而不是 20 个),您需要根据自己的谜题调整它们。

如果您进行这些更改(以及与其他三个旋转函数类似的更改),您应该会发现该函数开始返回不同的值。具体来说,旋转左环将保持左值不变,但应随着不同球进入交点而改变右值。

于 2012-09-18T03:48:52.927 回答