第2講 局所リスト構造解析
第9話 Sub sds(g As Integer) '数独作成プロシージャの解説その2
数独作成プロシージャ再掲
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
解説
sds (1)
が実行されると
For i = 0 To mx(y(1), x(1))
iii = (i + ii) Mod (mx(y(1), x(1)) + 1)
p(y(1), x(1)) = rlst(y(1), x(1), iii)
klk (1) '局所リスト解析プロシージャ
If 1 + 1 < 21 Then
sds (1 + 1)
If cn = 1 Then Exit Sub
Else
hyouji '問題表示プロシージャ
cn = cn + 1
Exit Sub
End If
Next
p(y(1), x(1)) = 0
座標(y(1), x(1))は
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 |
(6,8)です。
このセルは、
3がはいったことによる影響を受けないセルですから
p(6, 8) = rlst(6, 8, iii)
によって、
{1,2,3,4,5,6,7,8,9}
の内のどれかが入ります。
iiiの値が0の場合には1が選ればれ、
となります。
klk (1) '局所リスト解析プロシージャ
によって、今度は
オレンジと水色のセルのリスト構造解析が行われます。
2つだけ色が違っているのは、
3と1の両方の影響を受けるセルだからです。
水色のセルのリスト構造は、
{8,2,9,4,5,6,7,1,3}
mx(3, 8) = 6
オレンジのセルのリスト構造は、すべて
{9,2,3,4,5,6,7,8,1}
mx(3, 8) = 7
です。
If 1 + 1 < 21 Then
sds (1 + 1)
すなわち、
If 2 < 21 Then
sds (2)
の条件は当然成り立ちますので、
sds (2)
が実行され、sds(1)は自分の分身sds (2)を作り出します。
すると、
For i = 0 To mx(y(2), x(2))
iii = (i + ii) Mod (mx(y(2), x(2)) + 1)
p(y(2), x(2)) = rlst(y(2), x(2), iii)
klk (2) '局所リスト解析プロシージャ
If 2 + 1 < 21 Then
sds (2 + 1)
If cn = 1 Then Exit Sub
Else
hyouji '問題表示プロシージャ
cn = cn + 1
Exit Sub
End If
Next
p(y(2), x(2)) = 0
座標(y(2), x(2))は
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,4)です。このセルは
3の影響を受けていますから、リスト構造は
{1,2,9,4,5,6,7,8,3}
mx(8, 4) = 7
ですから、1,2,9,4,5,6,7,8のどれかから選ばれます。
iiiが5の値と取るとすると、
現時点の全体リスト構造解析は、
と白色を含めて8通りの複雑なものになります。
その1部を示しますと、
薄ピンク色のセルのリスト構造
{8,2,9,4,5,6,7,1,3}
mx(3, 8) = 6
黄色のセルのリスト構造
{8,2,9,4,5,7,6,1,3}
mx(3, 8) = 5
のセルのリスト構造
{1,2,9,4,5,8,7,6,3}
mx(3, 8) = 6
このような複雑な動きを取りながら、
疑似疑似数独作成ソフトは、疑似疑似問題を作成しています。
以上のような解説をヒント数21まで続けると、
あと10話程度必要になってしまいますので、
Sub sds(g As Integer) '数独作成プロシージャの解説はこれで打ち切ります。
是非ともこの後はご自分でトレースなさって下さい。
リスト構造
がかなり複雑になっているのは上の動きを考えれば当然といえます。
そして、リストの順番がかなりランダムになっていますが、
むしろランダムなることを意図して、
局所リスト構造解析プロシージャが組まれています。
では、その局所リスト構造解析プロシージャの解説を次話で行いましょう。
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入門へ
本サイトトップへ