数独とは、
3×3 のブロックに区切られた 9×9 の正方形の枠内に、それぞれ縦・横・ブロックで同じ数字が被らないように、
1〜9 までの数字を入れる
パズルの一つです。
"
アメリカでがんばりましょう"で、
数独を解く C プログラムが紹介されていましたが、今回、これを
Web ブラウザで動作するよう
JavaScript で作ってみました。
Mozilla Firefox、Netscape、Opera ブラウザをお使いの場合、解決の過程が見えて幸せになれます。
IE をお使いの場合、プログラムを開始すると解決するまで途中経過が見えません。
プログラムの仕組み
コンピュータパワーに任せて総当り
というのもアリかも知れませんが、できるだけ人間が解く手順と同じようにプログラム化してみました。
上のリンクは総当り方式ですが、普通に遅いです(^^;
処理の最適化などはほとんど考えていないので、無駄な走査が多々あると思います。
見通しはそれほど悪くないと思うので、興味のある方は改造してみてください。
- solve_init
-
空いているマスに数字候補として (1)〜(9) を入れます(setCandidate)
- solve_step1
-
行・列・ブロックを見て、確定している数字があった場合、それを数字候補から除きます(clearCandidate)
- solve_step2
-
行・列・ブロックを見て、数字候補が一つしかない場合、そのマスの数字が確定されます
- solve_step3
-
ある数字候補が、注目したブロックの一つの行あるいは列にだけ存在する場合、
他ブロックのそれと同じ行あるいは列にあるその数字候補を除きます
- solve_step4
-
あるマスに数字候補を仮定しながら再帰的に処理を進めます。
最終的に全てのマスが埋まっても矛盾があった場合、手数を戻って次々と数字候補を使って処理を進めます。
深さ優先の再帰処理を行います。
いろいろ
更新履歴
寄せられたコメント (最新 5 件を表示しています)
ver.1.10 に置き換え(=゚ω゚)ノ
組み合わせ爆発してなかなか解けないケースが減った…ハズ
solve_step4 で、何も考えずに x,y の小さいところの未確定マスから総当りを開始しているけれど、数字候補の数が最も少ないところを探して、そこから総当りを始める方が解決するのは早いね。