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

私が見ることができることから、それ同じままです。

基本的に、値の循環バッファがあり(の場合は特別なハンドルがあるためi = 20)、値がインデックスからインデックスに変化する回数をカウントします。

循環バッファを介して値をローテーションするだけでは、その数は変わりません。

たとえば、配列を考えてみましょう{1, 2, 2, 2, 3, 4}。そこには、、、、およびの4つの遷移1-22-3あり3-4ます4-1

次にリストを時計回りに回転させると、が得られ、{4, 1, 2, 2, 2, 3}遷移は、、、4-1およびです。1-22-33-4

つまり、遷移の順序は変わる可能性がありますが、は変わりません。


コードの追加に基づいてRotateLeftRingClockwise、これが問題の原因です。

左のリングを回転させるだけなので、ハンガリーのリングの交点を正しく処理していません。次の図のように、左のリングを回転させると、左のリングの周りで値を移動するだけでなく、右のリングの2つの配列要素を変更します(その逆も同様です)。

   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

最後の2行のこれらの配列インデックスは、上記の図に固有のものです(20セルではなく32セル)。独自のパズルに合わせて調整する必要があります。

これらの変更(および他の3つの回転関数と同様の変更)を行うと、関数が異なる値を返し始めることがわかります。具体的には、左のリングを回転させると、左の値は変更されませんが、異なるボールが交点に入ると、右の値が変更されます。

于 2012-09-18T03:48:52.927 に答える