第23講 数独を解くソフトVer.1の制作
第6話 問題構造解析プログラムを組むのためのヒント
c++

  0
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配列 

すなわち、すべての数字ON・OFF3次元配列の値を1とします。

座標(i,j)の数字ON・OFF配列 

これは主体セル処理です。

そして、再び主体セルを2次元上に動かしながら、
3つの客体セル処理をFor文によって行います。
3つとは、行処理・列処理・ブロック処理です。
行処理と列処理は第3次元処理となり、
ブロック処理は第3,4次元処理となります。
主体セルは、数字の入っていないセルだけを対象にしますが、
客体セル処理は該当セルすべてが対象になります。
客体セル処理では、
セルに数字が入っている場合、その数字の数字ON・OFF3次元配列の値を0と入れ直します。

具体的に説明しましょう。
c++
緑のセルを対象にして説明します。
まず、行処理において1と4がOFFにされます。

座標(0,3)の数字ON・OFF配列 

要するに、その数字はリスト内容はから外れるということです。
次に、列処理によって9,2,8がOFFにされます。

座標(0,3)の数字ON・OFF配列 

最後にブロック処理です。
9,6がブロックにありますので、9,6をOFFとします。9はダブってOFFとされますが、問題ありません。
ダブりをなくすためにはIf文処理をしなければなりませんから、処理時間としては節約になりません。

座標(0,3)の数字ON・OFF配列 


そして、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
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話へ

004
  


VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ

数学研究室に戻る