数独の達人−制作後記−
数独的なお話(?)
今回、どうやって答えを求めているのかというお話です。
以下、各マスは各数字に対し、「入る可能性が残っているか」を持っているものとします。
要は[true,true,true,true,true,true,true,true,true]が空のマスで、
[true,false,false,false,false,false,false,false,false]が1の入ったマス、ということです。
※2010/2/14,18 訂正しました。情けない……
(1).各行、列、ブロックに対し
値の一致するマスが、そのマスで残っている数字の個数と同じだけあるとき
→それらのマス以外のその行(or列orブロック)のマス全てに対し、先ほどの数字の入る可能性を消します。
(2).各数字に対して、各行(列)((ブロック))で
同じブロック(ブロック)((行or列))だけ残っているとき
→その同じブロック(ブロック)((行or列))の他のマスのその数字の入る可能性を消します。
(3).各行、列、ブロックに対して
各数字に対して、入りうるマスのリストを作成し、その9個のリストのうち、
リスト中のマスの数と同じだけ一致するリストがあるとき
→それらのリストを与えた数字以外の数字が入る可能性を、その各リストに属するマス全てに対して消します。
以上の手順を変化が無くなるまで続けます。
ただし、途中で全ての数字の入る可能性が無くなるマスが出たら矛盾なので終了します。
このやり方で、答えが求まるないし可能な限りマスが埋まると、思いました。
…ホントわかりづらいですね。上記以外の表現の仕方がわからない自分が気持ち悪い。
ちなみに、私は最初にバックトラックを用いて総当たりする方法をやっていたのですが、
どうやら1ヶ月かかっても求まらないような速度だったので、「消していく」方法にしました。
その他のお話
今回はなんとwindow.onload,document.mouseover,document.onclickを使用しています。
(ボタン).onclickを使用していないというのがミソ。 あと、今回はなんとalertを使用しています。
上のやつをプログラムに落とすのに労力を使いすぎて、メッセージボックスを用意する気力が残っていないからです。
…とか色々細かいところはアレですが、操作感はまあそれなりになっているつもりです。
やっぱり手で書く方が楽だというのはある種事実ですが、それを棚の上にあげれば、
これ以上やりやすい入力は今の私には思いつかない。
今回は勉強の目的もあるので、すでにこういうものがあるのかどうか調べていませんが、
もしなかったら相当すごいですよね。って考えるときはいつも既出なんですが。
ギャラリー ホーム