第33講 数独(ナンバープレイス)問題解決ソフトVer.4の制作
(数独(ナンバープレイス)問題作成ソフトに挑戦する人は☆☆)

第5話 
Ver.7コード解説その3=部分構造解析の基本的な考え方の確認
今話では、いよいよVer.4以上のメインである部分構造解析の解説をしていきます。
今回もVBA版でも、Windows版マルチスレッド対応の数独問題作成ソフトVer.1の開発においても大変苦労させられたのが、
この部分構造解析です。
特に、初めて作ったVBA版では頭が爆発しそうでした。
最初は、全体構造解析との違いが頭の中で整理されていなかったからです。
もうすでに、かなり整理されて頭に入っているのも関わらず、今回は成功しませんでした。
充分時間をかけ非常に努力したのにうまくいきませんでした。
そう言えば、Windows版マルチスレッド対応の数独問題作成ソフトVer.1の制作においても2週間近く動作不良の原因がわからず、
永遠にWindows版マルチスレッド対応の数独問題作成ソフトVer.1は作れなのではと絶望的な気分にさせられたのも部分構造解析でした。
2週間もあうでもない、こうでもないと試行錯誤をして、VBA版のコードと比較して結局最後に発見したのは、
たったひとつのスペリングミスでした。
普通は、スペリングミスの場合ビルドエラーしてしまうものなのですが、
その時は、ビルドは成功し動作もかなり正確に動きました。
何しろ、200題中199題は正しい問題を作っていたのです。
ところが、何故か200題に1題の割合で、別解のある問題を作成してしまうのです。
原因を2週間も精査して、結局発見したものはたったひとつの綴りミスだったのです。
今回は、考え違いなのかケアレスミスなのか原因究明に失敗しました。
プログラミングとは、本当に難しいものであると改めて感じています。
もっともここまで講義についてくることができました聡明な皆様は、あっさり成功していたかもしれませんね。
私は20年のプログラミング経験があり、3回目の挑戦であったのも関わらず、
制作に失敗したのですから、初心者の方が出来なかったとしてもほんの少しも落胆する必要はありません。

さて、前置きはそれぐらいにして解説に入りましょう。
再度基本的な考え方を確認しておきます。

7

を入れたことによって影響を受けるセルは

1 4
3 9 6
5
6 7 3
1 4 8
2 3 6
5
4 8

のピンクのセル

のみです。

つまり同行か、同列か、同ブロックのみです。
しかも、各部分(同行、同列、同行同列部分を除いた同ブロック)は、
は独立していて、例えば同行について解析するときには、同列と同行同列を除いた同ブロックについては考える必要がありません。

1 4
3 9 6
5
6 7 3
1 4 8
2 3 6
5
4 8

つまり、部分構造は互いに独立(互いに影響を受けない)な3つの構成部分

からなるのです。
互いに独立=互いに影響を受けない
ということは、その部分の解析だけに専念すればよいと言うことです。


また、重要な注意は

7





の関係です。

7

は、現在数独作成関数fにおいて対象にされている世界(セル)です。
それに対して、

は、その対象セルによってリスト構造に影響を受ける可能性のあるセルです。
数独作成関数fにおいては、

7

が主体となっているセル、
この表現がわかりにくいなら、
現在いろいろリスト候補にある数字を試行錯誤で入れているセルです。

は関数fにとって、今は関係のないセルです。
対象でないセルと言うことで客体セルと呼んでおきましょう。
対象セルを主体セル、関係ないセルを客体セルと呼んでおきましょう。

は数独作成関数fにとって、今は対象にされていないセルですが、
部分構造解析関数void bubunkouzoukaiseki(char g)にとっては、
分析対象となっているセル、すなわち主体セルです。

逆に、 部分構造解析関数bubunkouzoukaisekiにとって、

7

は解析対象になっていないセル、すなわち客体セルです。




同じセルでも数独作成関数fにとっては主体セルになるものが、
部分構造解析関数bubunkouzoukaisekiにおいては客体セルです。
逆に、
数独作成関数fにとっての客体セルが部分構造解析関数bubunkouzoukaisekiの主体セル=対象セルです。

7

の2つの関係を掴んでいないと、
部分構造解析コードは理解できません。
最初私の頭の中で整理できていなかったのも両者の関係です。

数独作成関数fにとっての対象セル=主体セル=現在リスト候補から試行錯誤で数字を入れているセル

7

そのセルによってリスト構造が影響を受けているかかどうかを検査=解析=分析
されているセル、

を明確に区別してください。















第4話へ 第6話へ


戻る

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