第8講 数独の問題を解くプログラムVer(−1)
第1話 数独解答例からの変更点
数独の問題を解くプログラムVer(マイナス1)
は第6講で解説した数独プログラム改良例を改良したものです。
改良点は3つあります。
Sub hyoujiの改良、代入処理が加わったこと、Sub sakuseiの改良です。
Sub hyoujiの改良は、数独解答例に戻しただけです。
小ブロックの仕切り線は、エクセル側に最初から罫線が引かれているので必要ないからです。
次にSub dainyuuについて説明しましょう。
Sub dainyuu()
Dim i, j As Integer
For i = 0 To 8
For j = 0 To 8
mah(i, j) = Cells(4 + i, 2 + j)
Next
Next
For i = 0 To 8
For j = 0 To 8
If mah(i, j) < 1 Then mah(i, j) = 0
Next
Next
End Sub
このソースでは、エクセルの問題図にある問題を代入しています。
For i = 0 To 8
For j = 0 To 8
If mah(i, j) < 1 Then mah(i, j) = 0
Next
Next
の部分は何をしているかというと、
空欄のところは値が何も入っていないので、
そこに対応するmah(i, j)にも値が入っておりません。
そこで、空欄に対応するところに0を入れ直しているのです。
3番目にSub sakuseiの説明をします。
Sub sakusei(g As Integer)
Dim i, j, k, l, hh, wa As Integer
j = g Mod n * n
i = Int(g / (n * n))
For k = 1 To n * n
mah(i, j) = k
If j > 0 Then
For l = 0 To j - 1
If mah(i, l) = mah(i, j) Then GoTo
owari
Next
End If
If i > 0 Then
For l = 0 To i - 1
If mah(l, j) = mah(i, j) Then GoTo
owari
Next
End If
ia = i Mod n
ja = j Mod n
If ia > 0 Then
For l = 0 To ia - 1
For m = 0 To n - 1
If (j - ja + m) <>
j And (i - ia + l) <> i Then
If mah(i, j) = mah(i
- ia + l, j - ja + m) Then GoTo owari
End If
Next
Next
End If
If g + 1 < n * n * n * n Then
sakusei (g + 1)
Else
cn = cn + 1
hyouji
End If
owari:
Next
mah(i, j) = 0
End Sub
のピンクが赤に変わり、青が加わったことです。
Sub sakusei(g As Integer)
Dim i, j, k, l, hh, wa As Integer
If cn = 1 Then Exit Sub
j = g Mod n * n
i = Int(g / (n * n))
If mah(i, j) > 0 Then
If g + 1 < hs Then
sakusei (g + 1)
Exit Sub
Else
cn = 1
hyouji
Exit Sub
End If
End If
For k = 1 To n * n
mah(i, j) = k
If j > 0 Then
For l = 0 To 8
If l <> j And mah(i, l) = mah(i, j) Then GoTo owari
Next
End If
If i > 0 Then
For l = 0 To 8
If l <> i And mah(l, j) = mah(i, j) Then GoTo owari
Next
End If
ia = i Mod n
ja = j Mod n
If ia > 0 Then
For l = 0 To 2
For m = 0 To 2
If (j - ja + m) <>
j And (i - ia + l) <> i Then
If mah(i, j) = mah(i
- ia + l, j - ja + m) Then GoTo owari
End If
Next
Next
End If
If g + 1 < n * n * n * n Then
sakusei (g + 1)
Else
cn = 1
hyouji
Exit Sub
End If
owari:
Next
mah(i, j) = 0
End Sub