有人可以解释为什么这不起作用? (意思是变量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
答案 0 :(得分:1)
从我所看到的,将保持不变。
你基本上有一个循环的值缓冲区(由于你在i = 20
时的特殊句柄),你计算了值从索引变为索引的次数。
如果只是通过循环缓冲区旋转值,那么这个数字就不会改变。
以数组{1, 2, 2, 2, 3, 4}
为例。那里有四个转换,1-2
,2-3
,3-4
和4-1
。
如果您顺时针旋转列表,则会得到{4, 1, 2, 2, 2, 3}
,转换为4-1
,1-2
,2-3
和3-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个),您需要根据自己的难题进行调整。
如果您进行了这些更改(以及与其他三个旋转函数类似的更改),您应该会发现函数开始返回不同的值。具体来说,旋转左环会使左侧值保持不变,但是当不同的球进入交叉点时,应该更改正确的值。