第22講 数独=ナンプレの自動生成
第3話 ラテン方陣解答例
コード
Dim m(9, 9), cn As Integer
Private Sub CommandButton1_Click()
  cn = 0
  f (0)
End Sub
Sub f(g As Integer)
  Dim x As Byte, y As Byte
  y = Int(g / 9)
  x = g Mod 9
  Dim i, j, k As Byte
  Dim cna As Integer, cns As Integer
  For i = 1 To 9
    m(x, y) = i
    
    If x > 0 Then
      For j = 0 To x - 1
        If m(x, y) = m(j, y) Then GoTo tobi
      Next
    End If
    If y > 0 Then
      For j = 0 To y - 1
        If m(x, y) = m(x, j) Then GoTo tobi
      Next
    End If
    If g + 1 < 81 Then
      f (g + 1)
    Else
      cna = cn Mod 9
      cns = Int(cn / 9)
      For j = 0 To 8
        For k = 0 To 8
          Cells(7 + 10 * cns + j, 1 + 10 * cna + k) = m(j, k)
        Next
      Next
      cn = cn + 1
    End If
tobi:
  Next
End Sub
Private Sub CommandButton2_Click()
  Cells.Select
  Selection.ClearContents
  Cells(1, 1).Select
End Sub

実行例
入門
ダウンロード用参考ファイル


さて、次の課題です。
上のコードを改良して、実行画面が
vb
となるようにしましょう。つまり、ブロックがわかるように境界線を入れるということです。
かなりの難問ですよ。






第2話へ 第4話へ

004
  

VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ

数学研究室に戻る