数独の自動での解かせ方 ― 2010年09月27日 10時09分27秒
PHPでコーディング中なので、アルゴリズムだけ書いてみる。
まず、3×3のマスに1から9までの数字を1つずつ埋めるパターンは有限であることに着目する。このパターンを配列として格納しておく。ちなみにパターンの数は362,880ある。
数字が固定されている部分があれば、それは対象となるパターンを減らすことが可能になることを示す。1ヶ所固定されていれば40,320パターンになる。2ヶ所なら5,040パターンだ。計算の方法は簡単なので説明しない。ちなみに実際の問題では3×3のマスあたりで3~4ヶ所固定されているから、必要なパターンの数はだいぶ少ないね。
あとは、9×9のマスに片っ端からパターンを当てはめて、縦横の数字が1から9まで揃うかどうかをチェックしていけばいい(足して45になるか、でもいいかな)。36万通りの9重のループだからかなり時間がかかるけど、一番簡単に求められる。
実際には全部チェックすると時間がかかりすぎるので、同じ列に同じ数字があるパターンはスキップするようにすれば総当りをチェックする必要はない。
‥‥というスキップ処理を作ってる最中で、スキップの判断をさせるのが面倒になってきた。って言うか、もう飽きてきた。処理を考えてる暇があれば実際に解いたほうが早い(1問だけならね)。
まず、3×3のマスに1から9までの数字を1つずつ埋めるパターンは有限であることに着目する。このパターンを配列として格納しておく。ちなみにパターンの数は362,880ある。
数字が固定されている部分があれば、それは対象となるパターンを減らすことが可能になることを示す。1ヶ所固定されていれば40,320パターンになる。2ヶ所なら5,040パターンだ。計算の方法は簡単なので説明しない。ちなみに実際の問題では3×3のマスあたりで3~4ヶ所固定されているから、必要なパターンの数はだいぶ少ないね。
あとは、9×9のマスに片っ端からパターンを当てはめて、縦横の数字が1から9まで揃うかどうかをチェックしていけばいい(足して45になるか、でもいいかな)。36万通りの9重のループだからかなり時間がかかるけど、一番簡単に求められる。
実際には全部チェックすると時間がかかりすぎるので、同じ列に同じ数字があるパターンはスキップするようにすれば総当りをチェックする必要はない。
‥‥というスキップ処理を作ってる最中で、スキップの判断をさせるのが面倒になってきた。って言うか、もう飽きてきた。処理を考えてる暇があれば実際に解いたほうが早い(1問だけならね)。
最近のコメント