第12講 数独の問題を解くプログラムVer2解説 
第3話 ソース解説

Private Sub CommandButton1_Click()
      ・
     ・
  syokika1
     ・
     ・
End Sub

Sub syokika1()

  cn = 0
  For i = 0 To 8
    For j = 0 To 8
      mah(i, j) = 0
      cnn(i, j) = 0
    Next
  Next

End Sub

まずこの部分の役割を確認しましょう。初期化して、すべての配列の値を0にセットしています。
初期化を入れる理由は、プログラムを連続して実行すると前の値が残っていて、プログラムの影響を与えてしまう場合があるからです。
Ver(−1)、Ver0、Ver1では入れてきませんでしたが、これは入れ忘れただけで本来は入れた方がよいのです。

次に、
Sub sakusei(g As Integer)
          ・
          ・  
    If g + 1 < hs Then
      
syokika2 (g)
      
mondaikaiseki
      bangousakusei (g + 1)

      sakusei (g + 1)
      If cn = 1 Then Exit Sub
    Else
      cn = 1
      hyouji
      Exit Sub
    End If

  Next

  
End Sub

Sub syokika2(g As Integer)
  For i = 0 To 8
    For j = 0 To 8
      hh = 1
      For k = 0 To g
        x = jz(k)
        y = iz(k)
        If i = y And j = x Then
          hh = 0
          Exit For
        End If
      Next
      If hh = 1 Then
        cnn(i, j) = 0
        For k = 0 To 100
          dhs(i, j, k) = 0
          dhs1(i, j, k) = 0
        Next
      End If
    Next
  Next
End Sub

の部分の意味を説明しましょう。Ver1では問題解析は、最初の一回限りでした。
Ver2ではセルに数字を入れる度に、問題解析を0からやり直す
(ここに無駄があります。ここを改善したのがVer3となります。)ために、問題解析の前に初期化しているのです。
すなわち、cnn(i, j)dhs(i, j, k)dhs1(i, j, k)の値をいったすべて0に戻し、mondaikaisekiで解析してすべて値を入れ直しているわけです。
bangousakusei (g + 1)に注目してください。Ver1では単にbangousakusei ()となっていました。
Ver1では問題解析もランク付け(番号付け)も1回限りでしたので、値を渡す必要がなかったのに対して、
Ver2では毎回ランク付けをし直しますので、値を渡した方がよいのです。
なぜなら0からgまでは番号付けが行われていますので、g+1以降のみを番号付けすればよいからです。
Sub bangousakusei(h As Integer)

  
Dim i1, i2, i3, m As Integer
  
If cn = 1 Then Exit Sub
  
g = h
  
For i = 0 To 9
    For j = 0 To 8
      For k = 0 To 8
        If mah(j, k) = 0 Then
          If cnn(j, k) = i Then
            iz(g) = j
            jz(g) = k
            g = g + 1
          End If
        End If
      Next
    Next
  Next

  If h = 0 Then hs = g

End Sub

第2話へ 


VB入門講義応用編トップへ

VB入門講義トップへ