第3講 数独作成アプリVer.1開発その1
第4話 試行錯誤をやり直すときの問題点その2
第3話の問題は
数独自動生成アプリ9×9・16×16・25×25統合版Ver.1(2017/03/16完成)
を開発する際の一番大きな問題でした。
どうして上手くいかないのか原因が解明できず、
この壁を乗り越えるのに1週間もかかってしまいました。
10年以上前に開発した数独問題作成ソフトVer7でもまったく同じ箇所で、
悪戦苦闘して問題をクリアしたことを、
忘れていて同じ誤りを犯しました。
前のソフトを一切見ないで白紙の状態から開発したためです。
5,6年前に開発した
良問難問数独自動生成アプリVer.4(対称形)
良問難問数独自動生成アプリVer.3(非対称形)
等も一切参照せずに0からスタートした理由は、
前の発想に囚われず、自由にプログラミングしようということだったのですが、
正直にいうと、それらのコードを読んでも理解できなかったのです。
自分で作ったプログラムコードなのに理解できない!
(その反省から、
数独自動生成アプリ9×9・16×16・25×25統合版Ver.1
においては注釈文がかなり入れてあります。)
もちろん時間をかけて読んでいけば理解できたのでしょうが、
面倒になり最初から作り直してしまったのです。
そして、同じところで躓いてしまったのです。
上手くいかない原因は、
数独自動生成アプリ9×9・16×16・25×25統合版Ver.1
の注釈文に書いてある通りです。
その注釈文を引用しましょう。
−−−以下引用−−−
Dim cn As Byte '解答個数
Dim kahi(24, 24, 24) As Byte
'kahi(i,j,k):k+1は 値が0のときcll(i,j)に代入できる
'1ときは代入できない。
'イメージは0が白で、1が黒である。黒は入力不可を示す。
Dim ckahi(624, 24, 24, 24) As Byte
'kahi(i,j,k)の4次元保存
'最初の次元はgすなわち時間を表す。
'以下時間とはgの比喩であり、gは進んだり戻ったりするので、
'時間も進んだり戻ったりすることになる。
'うまくいかなかったとき、過去に戻ってやり直している。
'原因は過去にあるからである。
'kahi(i,j,k)もmx(i,j)もrlst(i,j,k)も時間とともに変遷する。
'復元する際に、どの時間(g)のときのkahi(i,j,k)・mx(i,j)・rlst(i,j,k)
'なのかが問題になる。
'次の2次元は、場所(縦座標と横座標)である。
'最後の次元は、(セルに入る数字)−1である。
Dim n As Integer '次元数
Dim cll(24, 24) As Byte 'セルに問題と解答を入力
Dim ccll(24, 24) As Byte
Dim mx(24, 24) As Byte 'cll(i,j)に代入できるリスト数
Dim cmx(624, 24, 24) As Byte
'mx(i,j)の3次元保存
'最初の次元は時間を表し、残りの次元は場所(縦座標と横座標)に対応する。
Dim rlst(24, 24, 24) As Byte 'cll(i,j)に代入できる候補(リスト)数字
Dim crlst(624, 24, 24, 24) As Byte
'rlst(i,j,k)の4次元保存
'最初の次元はgすなわち時間を表す。
'次の2次元は、場所(縦座標と横座標)である。
'最後の次元は、リスト番号−1である。
'リスト番号はリスト(候補されている)されている数字の順番を示す。
Dim hintosu As Integer 'ヒント数
Dim y(624) As Byte 'y座標(縦座標)
Dim x(624) As Byte 'x座標(横座標)
Dim cy(624) As Byte 'y座標(縦座標)
Dim cx(624) As Byte 'x座標(横座標)
−−−以上引用−−−
かなり注釈文が入れてあることが分かります。
これは、自分のためと開発している途中で、
是非ともexcel 2016 vba 入門講義の題材にしたい気持ちが強くなったからです。
引用部分の中心をもう一度引用します。
'最初の次元はgすなわち時間を表す。
'以下時間とはgの比喩であり、gは進んだり戻ったりするので、
'時間も進んだり戻ったりすることになる。
'うまくいかなかったとき、過去に戻ってやり直している。
'原因は過去にあるからである。
'kahi(i,j,k)もmx(i,j)もrlst(i,j,k)も時間とともに変遷する。
'復元する際に、どの時間(g)のときのkahi(i,j,k)・mx(i,j)・rlst(i,j,k)
'なのかが問題になる
gは時間の比喩であると説明していますが、
正確には、セルの位置です。
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 |
上の表のピンクの数字がgです。
For i = 0 To n - 1
If p(y(g), i) = 0 Then
hth(y(g), i) = 0
For j = 0 To mx(y(g), i)
If p(y(g), x(g)) = rlst(y(g), i, j) Then
If mx(y(g), i) = 0 Then
klk = 0
Exit Function
End If
hth(y(g), i) = 1
For k = 0 To n - 1
crlst(y(g), i, k) = rlst(y(g), i, k)
Next
cmx(y(g), i) = mx(y(g), i)
w = rlst(y(g), i, j)
rlst(y(g), i, j) = rlst(y(g), i, mx(y(g), i))
rlst(y(g), i, mx(y(g), i)) = w
mx(y(g), i) = mx(y(g), i) - 1
Exit For
End If
Next
End If
Next
・
Sub hukugen(g As Integer)
Dim i As Byte, j As Byte, ybs As Byte, xbs As Byte, isy As Byte, ia As Byte
For i = 0 To n - 1
If hth(y(g), i) = 1 Then
For j = 0 To n - 1
rlst(y(g), i, j) = crlst(y(g), i, j)
Next
mx(y(g), i) = cmx(y(g), i)
End If
Next
ではだめな理由は、どの位置の数字を基に、
局所リスト構造解析がなされたのかを把握しないと、
オレンジのセルの復元を行う際に、
2によって変更されたリスト構造を元に戻すのか、
8によって変更されたリスト構造を元に戻すのか、
7によって変更されたリスト構造を元に戻すのか、
4によって変更されたリスト構造を元に戻すのか、
どれなのかが分からずに正確な復元が出来ないのです。
配列に位置情報であるgを添え字として組み込めば、
2,8,7,4のどれの影響を排除するのかが分かります。
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入門へ
本サイトトップへ