第23講 数独を解くソフトVer.1の制作
第2話 数独を解くソフトVer.0の完成
コード例
Dim m(9, 9), cn As Byte
Private Sub CommandButton1_Click()
hj = Timer
cn = 0
dainyuu
f (0)
ow = Timer
Cells(3, 22) = "作成時間は"
Cells(3, 23) = ow - hj
Cells(3, 24) = "秒です。"
End Sub
Sub dainyuu()
Dim i As Byte, j As Byte
For i = 0 To 8
For j = 0 To 8
m(i, j) = Cells(3 + i, 2 + j)
Next
Next
For i = 0 To 8
For j = 0 To 8
If m(i, j) < 1 Then
m(i, j) = 0
End If
Next
Next
End Sub
Sub f(g As Integer)
Dim x As Byte, y As Byte
Dim i, j, k, zy, zx As Byte
y = Int(g / 9)
x = g Mod 9
If m(x, y) > 0 Then
If g + 1 < 81 Then
f (g + 1)
Else
For j = 0 To 8
For k = 0 To 8
Cells(13 + j, 2 + k) = m(j, k)
Next
Next
cn = cn + 1
If cn = 1 Then Exit Sub
End If
Exit Sub
End If
Dim xa As Byte, ya As Byte, xs As Byte, ys As Byte, kk As Byte, kkk As Byte
xa = x Mod 3
ya = y Mod 3
xs = Int(x / 3)
ys = Int(y / 3)
kk = 9 * Rnd()
For i = 1 To 9
kkk = (kk + 4 * i) Mod 9 + 1
m(x, y) = kkk
For j = 0 To 8
If j <> x Then
If m(x, y) = m(j, y) Then GoTo tobi
End If
Next
For j = 0 To 8
If j <> y Then
If m(x, y) = m(x, j) Then GoTo tobi
End If
Next
For j = 0 To 2
For k = 0 To 2
If 3 * xs + j <> x And 3 * ys + k <> y Then
If m(x, y) = m(3 * xs + j, 3 * ys + k) Then GoTo tobi
End If
Next
Next
If g + 1 < 81 Then
f (g + 1)
Else
For j = 0 To 8
For k = 0 To 8
Cells(13 + j, 2 + k) = m(j, k)
Next
Next
cn = cn + 1
If cn = 1 Then Exit Sub
End If
If cn = 1 Then Exit Sub
tobi:
Next
m(x, y) = 0
End Sub
Private Sub CommandButton2_Click()
Rows("3:11").Select
Selection.ClearContents
Rows("13:22").Select
Selection.ClearContents
Cells(2, 1).Select
End Sub
実行例
ダウンロード用参考ファイル
このVer.0でも書籍やサイト上にある難問をほとんど1秒以内で解けてしまいます。
しかし、このVer.0にも苦手な問題があります。
この問題は私のパソコンで34秒も要してしまいます。
Ver.0の改良をしていきますが、その前に次話では詳しくプログラムを解説しましょう。
第1話へ 第3話へ
VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
数学研究室に戻る