第14講 数独の自動生成
第2話 数独の解答を自動生成するには?
私は、数独の存在を知って数ヶ月もかからないで、
数独問題自動作成アプリの開発に成功しました。
解答自動生成については、1日で開発に成功してしまいました。
能力の低い私が、あっという間に開発できてしまった理由は、
魔方陣の自動生成ソフト作りを研究していたからです。
魔方陣自動生成ソフトをちょっと改良すれば、
数独解答自動生成ソフトが出来ることは、
直感で分かりました。
実は、本講義の

第9講 サブプロシージャの再帰的使用
第11話 魔方陣生成ソフトの完成コードと解説その1

で作った
oiu
ht
を実現するプログラム例
Dim a(20) As Integer, n As Integer, cn As Long
Private Sub CommandButton1_Click()

  CommandButton2_Click
  cn = 0
  n = Cells(4, 2)
  Call f(0) 'n次魔方陣作成プロシージャ
End Sub

Sub f(g As Integer)

  Dim i As Integer, j As Integer
  
  For i = 1 To n * n
    If g > 0 Then
      For j = 0 To g - 1
        If i = a(j) Then GoTo tobi
      Next
    End If
    a(g) = i
    
    If g Mod n = n - 1 Then
      w = 0
      For j = 0 To n - 1
        w = w + a(n * Int(g / n) + j)
      Next
      If w <> Int(n * (n * n + 1) / 2) Then GoTo tobi
    End If
    
    If Int(g / n) = n - 1 Then
      w = 0
      For j = 0 To n - 1
        w = w + a(n * j + (g Mod n))
      Next
      If w <> Int(n * (n * n + 1) / 2) Then GoTo tobi
    End If
    
    If g = n * n - 1 Then
      w = 0
      For j = 0 To n - 1
        w = w + a(n * j + j)
      Next
      If w <> Int(n * (n * n + 1) / 2) Then GoTo tobi
    End If
    
    If g = n * (n - 1) Then
      w = 0
      For j = 0 To n - 1
        w = w + a(n * j + n - 1 - j)
      Next
      If w <> Int(n * (n * n + 1) / 2) Then GoTo tobi
    End If
    
    If g + 1 < n * n Then
      Call f(g + 1)
    Else
      Call h
    End If
tobi:
  Next
  
End Sub

Sub h()

  Dim i As Integer, j As Integer, s As Integer, am As Integer, w As Integer
  

  For i = 0 To n * n - 1
    s = Int(i / n)
    am = i Mod n
    Cells(6 + s + (n + 1) * Int(cn / 5), 2 + am + (n + 1) * (cn Mod 5)) = a(i)
  Next
  cn = cn + 1
  
tobi:
  
End Sub

Private Sub CommandButton2_Click()
  
  Rows("5:20000").Select
  Selection.ClearContents
  Cells(1, 1).Select
  
End Sub

参考ダウンロード添付ファイル

を改良すれば、数独解答自動生成ソフトは作ることが出来るのです。
重複条件の検査を
列・行・ブロック内に限定して、
列合計・行合計・対角線合計の条件を外せばよいのです。

数独解答自動生成に入る前に、
魔方陣自動生成ソフトを改良しておきましょう。
配列

Dim a(20) As Integer
を2次元配列
Dim a(16,16) As Integer
に変更しておいて(将来16次数独まで考えるために大きく取ってある)、
列と行の条件検査が簡単になるようにしたいわけです。
2次元配列に変更するためには、
Sub f(g As Integer)

  Dim i As Integer, j As Integer, jy As Integer, jx As Integer
  Dim gy As Integer, gx As Integer
  
  gy = Int(g / n)
  gx = g Mod n
  For i = 1 To n * n
    If g > 0 Then
      For j = 0 To g - 1
        jy = Int(j / n)
        jx = j Mod n
        If i = a(jy, jx) Then GoTo tobi
      Next
    End If
    a(gy, gx) = i
          ・
          ・
          ・
とすればよいのです。
2次元配列にしましたので、
表示プロシージャhのコードを変更しなければなりません。
では皆さん考えてみて下さい。





第1話へ 第3話へ
004

eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
vc++講義へ
excel 2013 2010 2007 vba入門へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
専門用語なしの C言語 C++ 入門(Visual C++ 2010で学ぶ C言語 C++ 入門)
専門用語なしの excel vba マクロ 入門 2013 2010 2007 対応講義 第1部
eclipse java 入門へ
excel 2016 vba 入門へ
小学生からエンジニアまでのRuby入門へ
本サイトトップへ