第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