第23講 数独を解くソフトVer.1の制作
第6話 問題構造解析プログラムを組むのためのヒント
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
・
・
・
問題構造解析のプログラムを組むためのヒントを授けます。
最初に次の3つのグローバル配列を用意します。
セル候補数2次元配列、数字ON・OFF3次元配列、セルリスト3次元配列です。
数字ON・OFF配列のONは1で、OFFは0で対応させることにします。
そして、次のような初期化をします。
For文とIf文を使い、数字の入っていないセルだけ、2次元上に動かしてすべてのセルについて、
数字ON・OFF配列をONにします。
これが3次元配列になってしまう理由は、
各座標で2次元、それに数字のON・OFFの次元が加わって3次元になるからです。
セルリスト配列も3次元になる理由は、座標の2次元に加えてリスト数字の次元が加わるからです。
座標(i,j)の数字ON・OFF配列 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
すなわち、すべての数字ON・OFF3次元配列の値を1とします。
座標(i,j)の数字ON・OFF配列 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
これは主体セル処理です。
そして、再び主体セルを2次元上に動かしながら、
3つの客体セル処理をFor文によって行います。
3つとは、行処理・列処理・ブロック処理です。
行処理と列処理は第3次元処理となり、
ブロック処理は第3,4次元処理となります。
主体セルは、数字の入っていないセルだけを対象にしますが、
客体セル処理は該当セルすべてが対象になります。
客体セル処理では、
セルに数字が入っている場合、その数字の数字ON・OFF3次元配列の値を0と入れ直します。
具体的に説明しましょう。
緑のセルを対象にして説明します。
まず、行処理において1と4がOFFにされます。
座標(0,3)の数字ON・OFF配列 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
要するに、その数字はリスト内容はから外れるということです。
次に、列処理によって9,2,8がOFFにされます。
座標(0,3)の数字ON・OFF配列 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 0 |
最後にブロック処理です。
9,6がブロックにありますので、9,6をOFFとします。9はダブってOFFとされますが、問題ありません。
ダブりをなくすためにはIf文処理をしなければなりませんから、処理時間としては節約になりません。
座標(0,3)の数字ON・OFF配列 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 |
そして、1つにセルについて3つの客体セル処理=行処理・列処理・ブロック処理が終わった後、
ONになっている場合、すなわち1になっている場合、それをリスト内容に入れます。
そして、ONになっている数を数えればそれがセル候補数数になります。今回は、3です。
セルリスト3次元配列をl(8,8,8)としておくならば
l(0,3,0)=3
l(0,3,1)=5
l(0,3,2)=7
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 |
さあ、皆さん問題構造解析プログラムを組んでみましょう。
第5話へ 第7話へ
VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
数学研究室に戻る