第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 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
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 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
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
については列
2 |
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 | 1 | 2 | |
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)を利用してくんで実行画面が
となるようにして下さい。
当然、シートの改良も必要になります。
初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門
数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ