第16講 全セルリスト構造解析(全体リスト構造解析)によって数独(ナンプレ)を解く
第5話 判定配列h(k)のプログラム例

Sub hyouji()
  
  Dim i As Byte, j 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
    Cells(14, 12 + i) = i + 1
    Cells(15, 12 + i) = h(i)
  Next

  
End Sub
Sub syokika()
  Dim k As Byte
  
  mx = 9
  For k = 0 To 8
    
h(k) = 1
    lst(k) = k + 1
  Next
  
End Sub

Sub cellkaiseki()
  
  Dim i As Byte, j As Byte
  
  For i = 0 To 8
    If mah(1, i) > 0 Then h(mah(1, i) - 1) = 0
  Next
  
  For i = 0 To 8
    If mah(i, 2) > 0 Then h(mah(i, 2) - 1) = 0
  Next
  
  For i = 0 To 2
    For j = 0 To 2
      If mah(i, j) > 0 Then h(mah(i, j) - 1) = 0
    Next

  Next


End Sub

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

End Sub

参考ファイル3

解説
Sub cellkaiseki()のコードはかなり難しいと思いますので、
1行1行トレースしてみましょう。
トレースする際、配列mah(i, j)は代入によって

   0
0 0 0 0 4 9 0 0 0 0
1 9 0 0 0 0 3 0 0 0
2 0 1 0 0 0 0 6 8 0
3 0 0 3 8 0 0 0 1 2
4 0 0 0 0 0 0 0 0 0
5 6 7 0 0 0 4 3 0 0
6 0 6 7 0 0 0 0 4 0
7 0 0 0 3 0 0 0 0 1
8 0 0 0 0 5 7 0 0 0

となっていることに注意して下さい。
なお、シート

   0
0 4 9
1 9 3
2 1 6 8
3 3 8 1 2
4
5 6 7 4 3
6 6 7 4
7 3 1
8 5 7

と区別するために数字の色が変えられています。

まず、
  For i = 0 To 8
    If mah(1, i) > 0 Then h(mah(1, i) - 1) = 0
  Next

の任務は、2行目

1 9 0 0 0 0 3 0 0 0

の解析です。
i = 0とき、
mah(1, 0) = 3
から
If mah(1, i) > 0 Then h(mah(1, i) - 1) = 0
のThen以降が実行され、
h(mah(1, i) - 1) = 0
すなわち
h(mah(1, 0) - 1) = 0
すなわち
h(3 - 1) = 0
すなわち
h(8) = 0
となります。
i = 1とき、
mah(1, 0) = 0
から
If mah(1, i) > 0 Then h(mah(1, i) - 1) = 0
のThen以降が実行されず、何もされません。
i = 4までは同様で何もされません。
そして、
i = 5とき、
mah(1, 0) = 3
から
If mah(1, i) > 0 Then h(mah(1, i) - 1) = 0
のThen以降が実行され、
h(mah(1, i) - 1) = 0
すなわち
h(mah(1, 5) - 1) = 0
すなわち
h(3 - 1) = 0
すなわち
h(2) = 0
となります。
i = 8のときも何もされません。

  For i = 0 To 8
    If mah(i, 2) > 0 Then h(mah(i, 2) - 1) = 0
  Next

については列

0
0
0
3
0
0
7
0
0


の解析であることはお分かりでしょう。
具体的なトレースはご自分でなさって下さい。


さて、最後の

  For i = 0 To 2
    For j = 0 To 2
      If mah(i, j) > 0 Then h(mah(i, j) - 1) = 0
    Next
  Next
はブロック

   0
0 0 0 0
1 9 0 0
2 0 1 0


の解析をしています。
これもご自分でトレースをなさって




h(0) = 0
h(1) = 1
h(2) = 0
h(3) = 1
h(4) = 1
h(5) = 1
h(6) = 0
h(7) = 1
h(8) = 0
となることを確認しましょう。

さて、いよいよセル(1,2)のリスト構造解析のプログラムを
判定配列h(k)を利用してくんで実行画面が
セル構造解析
セル数
となるようにして下さい。
当然、シートの改良も必要になります。

第4話へ 第6話へ



トップ

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

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