数独自動生成ソフト開発で学ぶ超初心者のためのC++マルチスレッドプログラミング入門
第1講 序章(周辺の説明とプログラミング体験)
第5話 第4話で数独の解き方を学んだけど、コンピュータに人間と同じ方法で考えさせるにはどうしたよいの?
数独の解き方を前話で学びましたが、
コンピュータに人間と同じ発想で解かせるにはどうしたらよいのでしょうか。
私は35才でコンピュータを買ってC言語で、
魔方陣を自動生成させることに夢中になりました。
魔方陣とは
のようにすべての行(横列を本講義では行と呼びます)
すべての列(縦列を本講義では単に列と書きます)
2本の対角線の合計が同じなっている方陣(正方形のこと)のことです。
是非5行の行合計 5列の列合計 2本の対角線合計が65になっていることを確認してください。
ときどき魔法陣と書いている人を見かけますが、
魔の方陣で魔方陣が正しい書き方です。
魔方陣を作ってみようということで、
皆さんにも後に魔方陣に挑戦していただきます。
空欄候補数字探索では、魔方陣の体験が重要だからです。
魔方陣自動生成普遍版
下線あるところはリンクが張ってありますので、
クリックしてください。
マイクロソフトによってブロックされていますので、
以下の手順でブロックを外してください。
-------------------以下ブロック外し手順---------------------------------------------------
下線があるところまずクリック
ファイルのダウンロードをクリックします。
エクスプローラーを起動してダウンロードフォルダを開きます。
ダウンロードフォルダにダブルクリックで入って
001をダブルクリックします。
エクセルが起動したら編集を有効にしてから
エクセルの右にある×をクリックしてエクセルを閉じます。
ダウンロードフォルダに行って
001のところで右クリックをしてから
プロパティをクリックします。
赤い囲いの許可するにチェックマークを入れてからOKをクリックします。
これでブロックが外れますので
ダウンロードフォルダに戻り001をダブルクリックするとエクセルが起動します。
もし編集を有効にするが現れたら編集を有効にするをクリックします。
そして、実行ボタンを押すと
3次から70次までの魔方陣を一瞬の内に生成します。
が現れない場合も実行をクリックしてください。
一度ブロックを外せば以上の作業は不要になります。
ですから起動したいときはダウンロードフォルダに行って001をダブルクリックすれば良いわけです。
001をよく使うフォルダにコピペすることを強くお勧めします。
-------------------以上ブロック外し手順---------------------------------------------------
ですが、魔方陣関係のプログラムは基本試行錯誤法すなわち仮定法で魔方陣を自動生成しています。
ですから、数独を試行錯誤法ではなく第4話で紹介した理詰めで解くにはどうしたらよいか、
最初のライン排除の段階で見当もつかず、
頭が爆発しそうになりました。
色塗りという方法でライン排除に成功しましたが、
そのコツを入れるのに2週間もかかってしまいました。
プログラミングを趣味にしていた私でも、
後5つのコツについて同じように苦しまなければならないかと暗い気持ちになってしまいました。
ところが、ブロック排除・ライン間接排除・相補確定の原理と排除・3on3確定と排除・#排除のすべてが色塗りのアイデアで
できることを発見して理詰め解法エンジンの開発に成功することができました。
色塗りとは何かを
中級者ためのVisual Studio Community 2022 C++による
マルチスレッド版数独自動生成ソフトの開発解説講座
の第9講第2話から引用することによって説明に代えさせていただきます。
------------------以下引用----------------------------------------------------------------
マルチスレッドプログラミングにとって、これと同じものを9枚用意することは非常に簡単です。
なぜ9枚かと申しますと、9種類の色を塗るからです。
本当は9枚あるので、黒色一色でもよいのですが9つの色を使った方がイメージしやすいと思います。
だだし、今回の例では2が入っていませんので8枚です。
それぞれが何を表しているかわかりますか。
例よって答えは20行下。
は1を入れてはいけないところです。
は3を入れてはいけないところです。
は4入れてはいけないところです。
は5を入れてはいけないところです。
は6を入れてはいけないところです。
は7を入れてはいけないところです。
は8を入れてはいけないところです。
は9を入れてはいけないところです。
1から9まで色を塗ってみてわかることは何も入力しない段階で、
2マスも確定するということです。
赤は4に確定します。
赤の入っているブロックに注目すると、
赤以外はすべて4を入れてはならない場所だからです。
黄色は5に確定します。
黄色のブロックに注目すると黄色以外は5を入れることができないからです。
それぞれに4と5入力すると
どこかの空欄は必ず1つの数字に確定するのです。
------------------以上引用----------------------------------------------------------------
初心者はこの空欄に入る数字の候補は何かと考えますが、
上級者は注目する数字を入れてはいけない空欄はどれかと考えます。
発想を逆にするわけですから、コペルニクス的転回となっているわけです。
引用によって間接排除などもできそうだ!の感覚をつかんでいただけると思います。
第4話へ 第6話へ
トップへ