第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
参考ダウンロード添付ファイル


前のものが
オレンジを対象から外すバージョン
101

でしたから少し遅くなってしまっています。
ですが、配置が規則的なものはまったく使えませんから仕方がありません。
さて、自然な配置が出来たことに満足して第3講を終了します。
第4講では今回作った数独解答自動生成アプリを改良して、
数独を解くソフト=問題を解くソフトの開発に入ります。




第7話へ 第4講第1話へ


トップへ