第14講 数独の自動生成
第2話 数独の解答を自動生成するには?
私は、数独の存在を知って数ヶ月もかからないで、
数独問題自動作成アプリの開発に成功しました。
解答自動生成については、1日で開発に成功してしまいました。
能力の低い私が、あっという間に開発できてしまった理由は、
魔方陣の自動生成ソフト作りを研究していたからです。
魔方陣自動生成ソフトをちょっと改良すれば、
数独解答自動生成ソフトが出来ることは、
直感で分かりました。
実は、本講義の
第9講 サブプロシージャの再帰的使用
第11話 魔方陣生成ソフトの完成コードと解説その1
で作った
を実現するプログラム例
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のコードを変更しなければなりません。
では皆さん考えてみて下さい。
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入門へ
本サイトトップへ