Visual Basic代码问题

时间:2012-09-18 03:41:34

标签: visual-studio-2010

有人可以解释为什么这不起作用? (意思是变量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

1 个答案:

答案 0 :(得分:1)

从我所看到的,保持不变。

你基本上有一个循环的值缓冲区(由于你在i = 20时的特殊句柄),你计算了值从索引变为索引的次数。

如果只是通过循环缓冲区旋转值,那么这个数字就不会改变。

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

如果您顺时针旋转列表,则会得到{4, 1, 2, 2, 2, 3},转换为4-11-22-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个),您需要根据自己的难题进行调整。

如果您进行了这些更改(以及与其他三个旋转函数类似的更改),您应该会发现函数开始返回不同的值。具体来说,旋转左环会使左侧值保持不变,但是当不同的球进入交叉点时,应该更改正确的值。