第3講 試行錯誤法でヒント数0数独の解答を作る(2)
第8話 ランダム版の1万個の生成時間を計測する
ランダム版の1万個の生成時間を計測するプログラム例
Dim n As Byte, m(8, 8) As Byte, cn As Integer
Private Sub CommandButton1_Click()
CommandButton2_Click
n = 9
cn = 0
hj = Timer
Randomize (tiemr)
f (0) 'n次順列作成プロシージャ
Cells(3, 2) = "1万個生成するのにかかった時間は"
Cells(3, 12) = Timer - hj
Cells(3, 13) = "秒です。"
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, yy As Byte, xx As Byte, ii As Byte, iii As Byte
y = Int(g / n)
x = g Mod n
a = cn Mod 10
s = Int(cn / 10)
ii = Int(n * Rnd)
For i = 0 To n - 1
iii = (i + ii) Mod n
m(y, x) = iii + 1
h = 1
If x > 0 Then
For j = 0 To x - 1
If m(y, x) = m(y, j) Then
h = 0
Exit For
End If
Next
End If
If h = 1 And y > 0 Then
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 And y > 0 Then
For j = 0 To n - 1
xx = 3 * Int(x / 3) + (j Mod 3)
yy = 3 * Int(y / 3) + Int(j / 3)
If x = xx And y = yy Then Exit For
If x <> xx And y <> yy Then
If m(yy, xx) = m(y, x) Then
h = 0
Exit For
End If
End If
Next
End If
If h = 1 Then
If g + 1 < n * n Then
f (g + 1)
If cn = 10000 Then Exit Sub
Else
' For j = 0 To n * n - 1
' Cells(4 + Int(j / n) + (n + 1) * s, 2 + (j Mod n) + (n + 1) * a) = m(Int(j / n), (j Mod n))
' Next
cn = cn + 1
If cn = 10000 Then Exit Sub
End If
End If
Next
End Sub
Private Sub CommandButton2_Click()
Rows("4:30000").Select
Selection.ClearContents
Cells(1, 1).Select
End Sub
参考ダウンロード添付ファイル
前のものが
オレンジを対象から外すバージョン
でしたから少し遅くなってしまっています。
ですが、配置が規則的なものはまったく使えませんから仕方がありません。
さて、自然な配置が出来たことに満足して第3講を終了します。
第4講では今回作った数独解答自動生成アプリを改良して、
数独を解くソフト=問題を解くソフトの開発に入ります。