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

今回解説するプログラムは数独の問題を解くプログラムVer0です。
加わったソースを最初に示しましょう。
Sub mondaikaiseki()

  Dim i, j, i1, i2, i3, i4, i5, i6 As Integer
    
    For i1 = 0 To 8
      For i2 = 0 To 8
        If mah(i1, i2) = 0 Then
          For i3 = 0 To 8
            dhs(i1, i2, i3) = 0
          Next
          For i3 = 0 To 8
            If i2 <> i3 And mah(i1, i3) > 0 Then dhs(i1, i2, mah(i1, i3) - 1) = 1
          Next
          For i3 = 0 To 8
            If i1 <> i3 And mah(i3, i2) > 0 Then dhs(i1, i2, mah(i3, i2) - 1) = 1
          Next
          i1s = Int(i1 / 3)
          i2s = Int(i2 / 3)
          For i3 = 0 To 2
            For i4 = 0 To 2
              If 3 * i1s + i3 <> i1 And 3 * i2s + i4 <> i2  *(実際にはここで改行はなし)
              And mah(3 * i1s + i3, 3 * i2s + i4) > 0 Then dhs(i1, i2, mah(3 * i1s + i3, 3 * i2s + i4) - 1) = 1
            Next
          Next
          For i3 = 0 To 8
            If dhs(i1, i2, i3) = 0 Then
              w = cnn(i1, i2)
              dhs1(i1, i2, w) = i3 + 1
              cnn(i1, i2) = cnn(i1, i2) + 1
            End If
          Next
       End If
    Next
  Next

End Sub

また、変更点をで示しましょう。
Sub sakusei(g As Integer)

  Dim i, j, k, l, hh, wa As Integer
  If cn = 1 Then Exit Sub
  j = jz(g)
  i = iz(g)
  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

  mx = cnn(i, j)
  For k = 0 To mx - 1
    mah(i, j) = dhs1(i, j, k)
          ・
          ・
          ・
End Sub

さて、Sub mondaikaisekiでは何をいているのでしょうか。
名前の通り、問題を解析しています。

4次元ループになっているので、初心者の方でなくてもこれはかなり難解です。
次話以降丁寧に説明していきましょう。

第2話へ


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

VB入門講義トップへ