第16講 全セルリスト構造解析(全体リスト構造解析)によって数独(ナンプレ)を解く
第4話 初期化のコード例

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

参考ファイル2

次の課題です。
いよいよセル(1,2)のリスト構造解析をする
Sub cellkaiseki()

End Sub
の記述に入りますが、
いきなりでは難しいですから、
ステップを踏みながらリスト構造解析の任を果たします。
最初のステップは数字が使えるかどうかの判定をします。

そのためにグローバル変数h(8)を用意します。

Dim mah(8, 8) As Byte, lst(8) As Byte, mx As Byte,
h(8) As Byte
この配列の役割は
k(kは1~9の内のどれかの数字)の数字を使ってもいいときは h(k-1) = 1
kの数字を使っててはだめなときは h(k-1) = 0
としてkが使えるかを判定することです。
k
-1となっている理由は、添え字が0から始まるからです。


初期化Sub syokika()において、
h(0) = 1
h(1) = 1
h(2) = 1
h(3) = 1
h(4) = 1
h(5) = 1
h(6) = 1
h(7) = 1
h(8) = 1
としておきます。
そして、cellkaisekiではまず

   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

の2行目である

1 9 3

の入っている数字を点検します。
9と3が入っていますので、
h(9-1) = 0
h(3-1) = 0
とします。次に,3列目である

3
7



の点検に入り、
h(3-1) = 0
h(7-1) = 0
とします。










最後にブロック

   0
0
1 9
2 1

を探査して、
h(9-1) = 0
h(1-1) = 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

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
すなわち
h(1-1) = 0
h(2-1) = 1
h(3-1) = 0
h(4-1) = 1
h(5-1) = 1
h(6-1) = 1
h(7-1) = 0
h(8-1) = 1
h(9-1) = 0
から使ってもいい数字は
{2,4,5,6,8}であることが判明します。
リスト数(候補数)も集合2,4,5,6,8,1,3,7,9}も
判定配列h(k)を使えば決定できます。


以上のヒントを参考にcellkaisekiにおいて、数独問題

   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

を解析して

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
となるようなプログラムを考えて下さい。
さらに、hyoujiとシートもいじり、実行ボタンを押すと
結果表示
となるようにして下さい。
消去プログラム
Private Sub CommandButton2_Click()
  
  Range("B14", "J22").Select
  Selection.ClearContents
  Range("M5", "V9").Select
  Selection.ClearContents
  Cells(2, 1).Select

End Sub
も改良して、消去ボタンを押すと
リセット
のように数字の部分も消えるようにして下さい。


第3話へ 第5話へ



トップ

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

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