第2講 局所リスト構造解析
第8話 Sub sds(g As Integer) '数独作成プロシージャの解説その1
数独作成プロシージャ再掲
Private Sub CommandButton1_Click()
・
・
sds (0) '数独作成プロシージャ
・
・
End Sub
Sub sds(g As Integer) '数独作成プロシージャ
Dim i As Byte, ii As Byte, iii As Byte
ii = Int(Rnd * mx(y(g), x(g)))
For i = 0 To mx(y(g), x(g))
iii = (i + ii) Mod (mx(y(g), x(g)) + 1)
p(y(g), x(g)) = rlst(y(g), x(g), iii)
klk (g) '局所リスト構造解析プロシージャ
If g + 1 < hintosu Then
sds (g + 1)
If cn = 1 Then Exit Sub
Else
hyouji '問題表示プロシージャ
cn = cn + 1
Exit Sub
End If
Next
p(y(g), x(g)) = 0
End Sub
解説
おそらく、excel 2016 vba入門講義を第1部から丁寧に読んできた方には、
今話の解説は必要としないでしょうが、第4部から読み始めた読者のために、
解説したいと思います。
ですから、理解している方は第9話に飛んで下さい。
hintosuが21であるとして以下トレースします。
最初、
sds (0) '数独作成プロシージャ
によって、sdsが呼び出されますので、gの値は0です。
For i = 0 To mx(y(0), x(0))
iii = (i + ii) Mod (mx(y(0), x(0)) + 1)
p(y(0), x(0)) = rlst(y(0), x(0), iii)
klk (0) '局所リスト解析プロシージャ
If 0 + 1 < 21 Then
sds (0 + 1)
If cn = 1 Then Exit Sub
Else
hyouji '問題表示プロシージャ
cn = cn + 1
Exit Sub
End If
Next
p(y(0), x(0)) = 0
座標(y(0), x(0))はどこを指すのでしょうか。
第30講第5話の
参考ダウンロード添付ファイル
を開いて
として実行ボタンを押すと、
となりますね。
ですから、ならば座標(y(0), x(0))は
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
0 | 12 | 14 | 16 | 18 | 20 | 22 | 24 | 26 | 28 |
1 | 30 | 32 | 34 | 36 | 38 | 40 | 42 | 44 | 46 |
2 | 48 | 50 | 52 | 54 | 56 | 58 | 60 | 62 | 64 |
3 | 66 | 68 | 70 | 72 | 74 | 76 | 78 | 80 | 1 |
4 | 3 | 5 | 7 | 9 | 11 | 13 | 15 | 17 | 19 |
5 | 21 | 23 | 25 | 27 | 29 | 31 | 33 | 35 | 37 |
6 | 39 | 41 | 43 | 45 | 47 | 49 | 51 | 53 | 55 |
7 | 57 | 59 | 61 | 63 | 65 | 67 | 69 | 71 | 73 |
8 | 75 | 77 | 79 | 0 | 2 | 4 | 6 | 8 | 10 |
(8,3)です。
したがって、
p(y(0), x(0)) = rlst(y(0), x(0), iii)
は
p(8, 3) = rlst(3, 3, iii)
です。座標(8,3)に座標(8,3)にリストされていた値のどれかが入ります。
まだ、白紙の状態ですから、座標(8,3)のリストは
{1,2,3,4,5,6,7,8,9}
ですし、mx(8, 3) = 8です。
ii = Int(Rnd * mx(y(g), x(g)))
For i = 0 To mx(y(g), x(g))
iii = (i + ii) Mod (mx(y(g), x(g)) + 1)
でしたから、iiiは0から8のいずれかの値がランダムに取られます。
iiiが2の値を取るときには、
{1,2,3,4,5,6,7,8,9}
3の値が選ばれ、
となります。
次の行では、
klk (0) '局所リスト構造解析プロシージャ
この3が入ったことによるリスト構造の変化を分析しています。
影響受けるセルはオレンジのセルです。
局所リスト構造解析の任務はすべてのオレンジの各セルのリスト構造が
{1,2,3,4,5,6,7,8,9}
となっていたものを
{1,2,9,4,5,6,7,8,3}
に変更することです。
当然オレンジの各セルの候補数字個数mx(i, j)の値も8から7に変更されます。
If 0 + 1 < 21 Then
sds (0 + 1)
の条件は当然成り立ちますので、
sds (0 + 1)
すなわち、
sds (1)
が実行されます。
この実行によって、数独作成プロシージャsdsは自分の分身を作り出します。
ただし、セル位置を示すgだけが異なった分身です。
eclipse c++ 入門
魔方陣 数独(ナンプレ)で学ぶ VBA 入門
数独(ナンプレ)のシンプルな解き方・簡単な解法の研究
vc++講義へ
excel 2013 2010 2007 vba入門へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
専門用語なしの C言語 C++ 入門(Visual C++ 2010で学ぶ C言語 C++ 入門)
専門用語なしの excel vba マクロ 入門 2013 2010 2007 対応講義 第1部
eclipse java 入門へ
excel 2016 vba 入門へ
小学生からエンジニアまでのRuby入門へ
本サイトトップへ