第8講 理詰め解法エンジンの開発
第2話 同じ紙を9枚用意し、それぞれのスレッドが色塗りをする
マルチスレッドプログラミングとは並列プログラミングです。
マルチスレッドプログラミングにとって、これと同じものを9枚用意することは非常に簡単です。
なぜ9枚かと申しますと、9種類の色を塗るからです。
本当は9枚あるので、黒色一色でもよいのですが9つの色を使った方がイメージしやすいと思います。
だだし、今回の例では2が入っていませんので8枚です。
それぞれが何を表しているかわかりますか。
例よって答えは20行下。
は1を入れてはいけないところです。
は3を入れてはいけないところです。
は4入れてはいけないところです。
は5を入れてはいけないところです。
は6を入れてはいけないところです。
は7を入れてはいけないところです。
は8を入れてはいけないところです。
は9を入れてはいけないところです。
1から9まで色を塗ってみてわかることは何も入力しない段階で、
2マスも確定しています。
赤は4に確定します。
黄色は5に確定します。
それぞれに4と5入力すると
どこかの空欄は必ず1つの数字に確定するのです。
第1話でも言いましたが、仮定法でやってきた人にとって新しい世界が見えることでしょう。
そして仮定法=背理法=試行錯誤法でやるより、
圧倒的な達成感を得ることができるのです。
理詰めで解けるようになったら数独・ナンプレは本当に面白いのです。
解き方はわかったけど、コンピュータに人間と同じように考えさせるためにはどうしたらよいの?
ですよね。
魔方陣の自動生成はすべて試行錯誤法でやっていましたから、
どうやったら組み込むことができるのか、2週間も考え込んでしまいました。
1つのコツを組み込むだけで頭が爆発しそうになりました。
それなのに後5つも組み込まないとは、
さすがの私もプログラミングがいやになりそうでした。
ですが、最初のコツを組み込むために考えた色塗りの方法がすべてに有効であることがわかって
理詰め解法エンジンの開発に成功したのです。
色塗りはいかにしたら可能でしょうか。
私はonoff[a][y][x][i]を用意してその問題を解消しました。
座標(y, x)上に0より大きい値が入っている場合
for(char j=0; j<n ;j++){
if(j != x){
onoff[[mondai[A][y][x]-1] ;
}
}
もちろん列とブロックについても同様にしなければなりません。
9色の色を塗り行・列・ブロックの中に1つだけ色が塗ってあるところを探し出して、
その色に対応する数を代入することによって理詰めへの第一歩を踏み出したのです。
コツでいうとライン排除とブロック排除を実現したのです。
第1話へ 第3話へ
トップへ