第8講 数独の問題を解くプログラムVer(−1)
第1話 数独解答例からの変更点

数独の問題を解くプログラムVer(マイナス1)
は第6講で解説した
数独プログラム改良例を改良したものです。
改良点は3つあります。
Sub hyoujiの改良、代入処理が加わったこと、Sub sakuseiの改良です。

Sub hyoujiの改良は、数独解答例に戻しただけです。
小ブロックの仕切り線は、エクセル側に最初から罫線が引かれているので必要ないからです。

次にSub dainyuuについて説明しましょう。
Sub dainyuu()
    Dim i, j As Integer

    For i = 0 To 8
        For j = 0 To 8
            mah(i, j) = Cells(4 + i, 2 + j)
        Next
    Next
    For i = 0 To 8
        For j = 0 To 8
            If mah(i, j) < 1 Then mah(i, j) = 0
        Next
    Next

End Sub
このソースでは、エクセルの問題図にある問題を代入しています。
    For i = 0 To 8
        For j = 0 To 8
            If mah(i, j) < 1 Then mah(i, j) = 0
        Next
    Next
の部分は何をしているかというと、
空欄のところは値が何も入っていないので、
そこに対応するmah(i, j)にも値が入っておりません。
そこで、空欄に対応するところに0を入れ直しているのです。


3番目にSub sakuseiの説明をします。

Sub sakusei(g As Integer)

    Dim i, j, k, l, hh, wa As Integer
        j = g Mod n * n
        i = Int(g / (n * n))

        For k = 1 To n * n
            mah(i, j) = k
            If j > 0 Then
                For l = 0 To j - 1
                    If mah(i, l) = mah(i, j) Then GoTo owari
                Next
            End If
            If i > 0 Then
                For l = 0 To i - 1
                    If mah(l, j) = mah(i, j) Then GoTo owari
                Next
            End If
            ia = i Mod n
            ja = j Mod n
            If ia > 0 Then
               For l = 0 To ia - 1
                   For m = 0 To n - 1
                       If (j - ja + m) <> j And (i - ia + l) <> i Then
                           If mah(i, j) = mah(i - ia + l, j - ja + m) Then GoTo owari
                       End If
                   Next
               Next
            End If

            If g + 1 < n * n * n * n Then
                sakusei (g + 1)
            Else
                cn = cn + 1
                hyouji
            End If
owari:
       Next
   mah(i, j) = 0


End Sub
ピンクに変わり、が加わったことです。
Sub sakusei(g As Integer)

    Dim i, j, k, l, hh, wa As Integer
        If cn = 1 Then Exit Sub
        j = g Mod n * n
        i = Int(g / (n * n))
        If mah(i, j) > 0 Then
           If g + 1 < hs Then
               sakusei (g + 1)
               Exit Sub
           Else
               cn = 1
               hyouji
               Exit Sub
           End If
         End If


        For k = 1 To n * n
            mah(i, j) = k
            If j > 0 Then
                For l = 0 To 8
                    If l <> j And mah(i, l) = mah(i, j) Then GoTo owari
                Next
            End If
            If i > 0 Then
                For l = 0 To 8
                    If l <> i And mah(l, j) = mah(i, j) Then GoTo owari
                Next
            End If
            ia = i Mod n
            ja = j Mod n
            If ia > 0 Then
               For l = 0 To 2
                   For m = 0 To 2
                       If (j - ja + m) <> j And (i - ia + l) <> i Then
                           If mah(i, j) = mah(i - ia + l, j - ja + m) Then GoTo owari
                       End If
                   Next
               Next
            End If

            If g + 1 < n * n * n * n Then
                sakusei (g + 1)
            Else
                cn = 1
                hyouji
                Exit Sub
            End If
owari:
       Next
   mah(i, j) = 0


End Sub


第2話へ

VB入門講義応用編トップへ

VB入門講義トップへ