第13講 プロシージャの再帰的使用による数独の自動生成
第5話 数独解答自動生成ソフトコード例

数独
コード例
Private Sub CommandButton1_Click()
  Dim n As Byte, cn As Integer, x(10, 10) As Byte
  Rows("5").Select
  Selection.ClearContents
  Range("A1").Select
  n = 9
  cn = 0
  Call f(0, cn, n, x())
End Sub
Sub f(g As Byte, cn As Integer, n As Byte, x() As Byte)
  Dim h As Byte, i As Byte, j As Byte, k As Byte, a As Byte, s As Integer, gi As Byte, gj As Byte
  Dim ji As Byte, jj As Byte, hh As Byte, w As Byte
  a = cn Mod 10
  s = Int(cn / 10)
  gi = Int(g / n)
  gj = g Mod n
  For i = 1 To n
    x(gi, gj) = i
    h = 1
    If gj > 0 Then
      For j = 0 To gj - 1
        If x(gi, j) = x(gi, gj) Then
          h = 0
          Exit For
        End If
      Next
    End If
    If h = 1 Then
      If gi > 0 Then
        For j = 0 To gi - 1
          If x(j, gj) = x(gi, gj) Then
            h = 0
            Exit For
          End If
        Next
      End If
    End If
    If h = 1 Then
      If (gi Mod 3) > 0 Then
        For j = 0 To (gi Mod 3) - 1
          For k = 0 To 2
            If gj <> 3 * Int(gj / 3) + k Then
              If x(gi, gj) = x(3 * Int(gi / 3) + j, 3 * Int(gj / 3) + k) Then
                h = 0
                Exit For
              End If
            End If
          Next
        Next
      End If
    End If


    If h = 1 Then
      If g + 1 < n * n Then
        Call f(g + 1, cn, n, x())
      Else
        For j = 0 To n - 1
          For k = 0 To n - 1
            Cells(7 + j + (n + 1) * s, 2 + k + (n + 1) * a) = x(j, k)
          Next
        Next
        cn = cn + 1
        If cn = 1 Then Cells(4, 17) = "数独が"
        Cells(4, 20) = cn
        If cn = 1 Then Cells(4, 25) = "個生成されています。"
      End If
    End If
  Next
End Sub
Private Sub CommandButton2_Click()
  Rows("4:20000").Select
  Selection.ClearContents
  Range("A1").Select
End Sub


今回は1から順に埋めていっていますが、
数独問題自動生成ソフトを作るには、
ランダムに数字が並べてある必要があります。
魔方陣
そこで、それぞれのセルの検索の始まりを1ではなく、
1から9までの数字からランダムに選び、
7→8→9→1→2→3→4→5→6
のように動かして、
それぞれのセルの始まりは、
ランダムですが結局はすべての場合を網羅するように変更したいのです。
始まりをランダムにするにはRndを使えば良いですね。

第6講 If文(分岐)を理解しよう
 第2話 If文とは?
 第3話 発生させたデータを評価する


を参考にしてください。

For文を使い、
7→8→9→1→2→3→4→5→6
のように動かすにはどうしたらよいですか。
ヒントはModです。
5 Mod 3
は5を3で割った余りで2でしたね。

第4話へ 第6話へ



トップ

初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門

数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ