第23講 数独を解くソフトVer.1の制作
第5話 問題構造解析はいかにしたら可能か。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
0 | * | 6 | 5 | 3 | 5 | 4 | * | 5 | 5 |
1 | 3 | 5 | * | * | 5 | * | 5 | 4 | 5 |
2 | 5 | 7 | 6 | 5 | 6 | 5 | 8 | 6 | 6 |
3 | 5 | 7 | 6 | 3 | 6 | * | 5 | 6 | 5 |
4 | 4 | 7 | * | 1 | 4 | 4 | 5 | 6 | * |
5 | 4 | 5 | 4 | 3 | * | * | 5 | * | 4 |
6 | 3 | 4 | 4 | * | 4 | 3 | 5 | * | * |
7 | * | 7 | 5 | 5 | 5 | 4 | 5 | 5 | 6 |
8 | * | 6 | 4 | * | 5 | 4 | 5 | 5 | 5 |
赤いセル=座標(4,3)に入る数字の候補:7
濃い緑セル=座標(0,3)に入る数字の候補:3,5,7
座標(0,3)に入る数字の候補:2,7,8
座標(3,3)に入る数字の候補:3,6,7
・
・
・
さて、このような問題構造解析はいかにしたらできるでしょうか。
この構造解析の難しさは、分析されるセルとそれと比べられるセルの2つがあることです。
分析対象セルを主体となるセル、分析対象と比べられるセルを客体セルと呼ぶことにすると、
主体セルと客体セルの2元構造になります。
1 | 4 | |||||||
3 | 9 | 6 | ||||||
5 | ||||||||
6 | 3 | |||||||
1 | 4 | 8 | ||||||
2 | 3 | 6 | ||||||
5 | ||||||||
4 | 8 |
例えば、上の赤いセルは薄緑のセルとすべてと比較されます。
つまり、赤のセルと同じ行上にはどんな数字が並んでいるか、
同様に、同じ列上には何があるか、
同じブロックの数字は何か、
を問題にしなければなりません。
主体セルは、表の数字が入っていないセルすべてを動きますから、
2次元ループ処理になります。
客体セルは列と行に関しては1次元処理ですが、
ブロックに関しては2次元処理です。
つまり、主体側2次元+客体側1次元ないし2次元ですから、
計3次元ないしは4次元ループ処理になります。
頭が混乱しますね。
主体セルを2次元に動かすとき、数字の入っているセルはスキップしなければなりません。
問題時において入っていたセルは、動かしてはいけないのですからセル構造解析をしても何の意味もありません。
もししたとしたら、候補数0、候補なしです。
ですから、数字に入っている数字を除外して2次元に動かす必要があります。
当然if文を使うことになります。
では、皆さん次話のヒントを参考にこの複雑な問題構造解析に挑戦してみましょう。
第4話へ 第6話へ
VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
数学研究室に戻る