第16講 全セルリスト構造解析(全体リスト構造解析)によって数独(ナンプレ)を解く
第6話 セル(
1,2)のリスト構造解析のプログラム例

プログラム全文
Dim mah(8, 8) As Byte, lst(8, 8, 8) As Byte, mx(8, 8) As Byte, h(8, 8, 8) As Byte

Private Sub CommandButton1_Click()
  
  Dim i As Byte, j As Byte
  dainyuu
  syokika
  For i = 0 To 8
    For j = 0 To 8
      If mah(i, j) = 0 Then
        Call cellkaiseki1(i, j)
        Call cellkaiseki2(i, j)
      End If
    Next
  Next
  hyouji

End Sub

Sub dainyuu()
  
  Dim i As Byte, j As Byte
  For i = 0 To 8
    For j = 0 To 8
      If Cells(4 + i, 2 + j) = "" Then mah(i, j) = 0 Else mah(i, j) = Cells(4 + i, 2 + j)
    Next
  Next
  
End Sub

Sub hyouji()
  
  Dim i As Byte, j As Byte, k As Byte
  For i = 0 To 8
    For j = 0 To 8
      Cells(14 + i, 2 + j) = mah(i, j)
    Next
  Next
  
  For i = 0 To 8
    For j = 0 To 8
      Cells(24 + 4 * i, 1 + 10 * j) = "セル"
      Cells(24 + 4 * i, 2 + 10 * j) = i
      Cells(24 + 4 * i, 3 + 10 * j) = j
      Cells(24 + 4 * i, 4 + 10 * j) = "のリスト"
      For k = 0 To 8
        Cells(25 + 4 * i, 1 + 10 * j + k) = lst(i, j, k)
      Next
      Cells(26 + 4 * i, 1 + 10 * j) = "セル"
      Cells(26 + 4 * i, 2 + 10 * j) = i
      Cells(26 + 4 * i, 3 + 10 * j) = j
      Cells(26 + 4 * i, 4 + 10 * j) = "のリスト数"
      Cells(27 + 4 * i, 1 + 10 * j) = mx(i, j)
      
    Next
  Next

  
  
End Sub

Sub syokika()

  Dim i As Byte, ja As Byte, k As Byte
  
  For i = 0 To 8
    For j = 0 To 8
      For k = 0 To 8
        h(i, j, k) = 1
        lst(i, j, k) = k + 1
      Next
    Next
  Next
  
End Sub

Sub cellkaiseki1(i As Byte, j As Byte)
  
  Dim k As Byte, l As Byte
  
  For k = 0 To 8
    If mah(i, k) > 0 Then h(i, j, mah(i, k) - 1) = 0
  Next
  
  For k = 0 To 8
    If mah(k, j) > 0 Then h(i, j, mah(k, j) - 1) = 0
  Next
  
  For k = 0 To 2
    For l = 0 To 2
      If 3 * Int(i / 3) + k <> i And 3 * Int(j / 3) + l <> j Then
        If mah(3 * Int(i / 3) + k, 3 * Int(j / 3) + l) > 0 Then h(i, j, mah(3 * Int(i / 3) + k, 3 * Int(j / 3) + l) - 1) = 0
      End If
    Next
  Next  (2014/12/07訂正)


End Sub

Sub cellkaiseki2(i As Byte, j As Byte)
  
  Dim k As Byte, w As Byte
  
  w = 0
  For k = 0 To 8
    If h(i, j, k) = 1 Then
      lst(i, j, w) = k + 1
      w = w + 1
    End If
  Next
  mx(i, j) = w
  For k = 0 To 8
    If h(i, j, k) = 0 Then
      lst(i, j, w) = k + 1
      w = w + 1
    End If
  Next
  
End Sub


Private Sub CommandButton2_Click()
  
  Rows("14:200").Select
  Selection.ClearContents
  Range("M5", "V9").Select
  Selection.ClearContents
  Cells(2, 1).Select

End Sub


参考ファイル4

さて、次の課題はセルの構造解析をセル(1,2)のみではなく、
すべてのセルについて構造解析を出来るように改善することです。
当然、
Dim mah(8, 8) As Byte, lst(8) As Byte, mx As Byte, h(8) As Byte

Dim mah(8, 8) As Byte, lst(
8, 8, 8) As Byte, mx(8, 8) As Byte, h(8, 8, 8) As Byte
と変更し、
Private Sub CommandButton1_Click()
  
  dainyuu
  syokika
  cellkaiseki1
  cellkaiseki2
  hyouji

End Sub

Private Sub CommandButton1_Click()
  
  Dim i As Byte, j As Byte
  dainyuu
  syokika
  
For i = 0 To 8
    For j = 0 To 8
      If mah(i, j) = 0 Then
        Call cellkaiseki1(i, j)
        Call cellkaiseki2(i, j)
      Next
    Next
  Next

  hyouji

End Sub

としなければなりません。
If mah(i, j) = 0 Thenは、
空欄のみを解析させるようにするために必要です。
また、その変更に伴って
Sub cellkaiseki1()
Sub cellkaiseki2()
のそれぞれは
Sub cellkaiseki1(
i As byte, j As Byte)
Sub cellkaiseki2(i As byte, j As Byte)
に変えなければならないですし、
hyoujiのプログラムをいじらなければなりません。
実行画面
表示
リスト表示


第5話へ 第7話へ



トップ

初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門

数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ