第3講 試行錯誤法でヒント数0数独の解答を作る(2)
第3話 疑似数独を生成する
を実現するプログラム例
Dim n As Byte, m(8, 8) As Byte, cn As Integer 'nは数独の一辺、x(15)は疑似数独を収納する配列、cnは疑似数独総数をカウントする変数
Private Sub CommandButton1_Click()
CommandButton2_Click
n = 9 '縦横を9にしている
cn = 0
f (0) '疑似数独作成プロシージャ
End Sub
Sub f(g As Byte)
Dim i As Byte, j As Byte, h As Byte, a As Integer, s As Integer, w As Byte
Dim y As Byte, x As Byte
y = Int(g / n)
x = g Mod n
a = cn Mod 10
s = Int(cn / 10)
For i = 0 To n - 1
m(y, x) = i + 1 '1から9までの数字を代入
h = 1
If x > 0 Then '行の重複を検査して、重複がある場合にはhを0として以下の処理をさせない。
For j = 0 To x - 1
If m(y, x) = m(y, j) Then
h = 0
Exit For
End If
Next
End If
If y > 0 Then '行の重複を検査して、重複がある場合にはhを0として以下の処理をさせない。
For j = 0 To y - 1
If m(y, x) = m(j, x) Then
h = 0
Exit For
End If
Next
End If
If h = 1 Then
If g + 1 < n * n Then '行・列の重複がなく、g + 1がn * n以下のときに、次のセル番号の世界に飛ぶ
f (g + 1)
If cn = 10 Then Exit Sub '疑似数独が10個生成した段階で探索をやめさせている。
Else
For j = 0 To n * n - 1 '疑似数独が出来たのでシートに表示させている。
Cells(4 + Int(j / n) + (n + 1) * s, 1 + (j Mod n) + (n + 1) * a) = m(Int(j / n), (j Mod n))
Next
cn = cn + 1 '疑似数独総数カウント
If cn = 10 Then Exit Sub '疑似数独が10個生成した段階で探索をやめさせている。
End If
End If
Next
End Sub
Private Sub CommandButton2_Click()
Rows("4:30000").Select
Selection.ClearContents
Cells(1, 1).Select
End Sub
参考ダウンロード添付ファイル
いよいよ念願の数独生成への挑戦の段階に達しました。
ですが、これを実現することはかなり難しい課題です。
ブロックの条件がD難度級だからです。
そこで、考え方を次話で説明してから皆さんに取り組んでいただくことにしましょう