数独

○数独とは

数独の問題は,下の例のように,9×9のマスの一部に数字が与えられていて,空いているマスに1から9までの数字を一つずつ入れていくものです。ルールは,「横の並び(行)にも縦の並び(列)にも太い線で囲まれた3×3のブロックのいずれにも1から9までの数字が一つずつ入っていること」で,このルールにしたがってすべてのマスに数字が入ったら完成です。下の図は,数独の問題の一つの例で,その完成例も示しましたので,数独のルールに合っているかどうか調べてみてください。

問題例の図

完成例の図

数独の答えを見つけるための初歩的な方法について説明しておきます。この方法は,数独のルールを利用するものです。数独のルールをいいかえると,「同じ行,列またはブロックには同じ数字を入れることはできない」となります。数独の問題では,81個のマスの一部には数字が与えられているので,空のマスに使うことができる数字は,1から9までの9個より少なくなります。使うことができる数字が1個であるマスは,数字を決定することができます。一つでも数字が決定されると,それが他のマスで使うことができる数字を減らすことになります。このような手順を繰り返して,すべてのマスの数字を決定することができれば,それが答えになります。具体的な手順の例は,次の図のようなものです。

消去法の手順の図

この方法を「消去法」と名付けたのは,候補数字を次々と消してゆく方法だからです。この消去法ですべての問題を解くことができるとは限りません。難しい問題では,途中で行きづまることもあります。そのときは別の方法を使わなければなりません。別の方法については,後に説明しますので,ここでは,先に示した問題例について消去法を使って答えを見つけてみましょう。

問題例の図をもう一度示します。

問題例の図(再掲)

手順にしたがって,空のマスに1から9までの数字を小さくかきこみます。

消去法の準備の図

次に候補数字を消去していきます。例として,(行1列7)のマスを考えます。この記号(行1列7)は,9×9の左上スミのマスの位置をしめしています。表の左端に行番号,上端に列番号があるので,「行1を右にみていった線と列7を下にみていった線のぶつかる位置にあるマス」が(行1列7)のマスとなります。(行1列7)のマスは,行1,列7,ブロック3に共通するので,(行1列7)の候補数字は,行1のルール,列7のルール,ブロック3のすべてについてルールにあうような数字でなければなりません。そこで,まず,行1に使われている数字を調べると,下の表のように,2,4,6,8なので,1から9までの数字からこれらを消すと残るのは1,3,5,7,9です。次に,この数字から列7で使われている数字,1,2,9を消すと残るのは,3と5と7です。この数字から,さらにブロック3で使われている数字,1,3,5,8を消して残るのは7のみとなります。残った候補数字が1個なので,このマスは7で決定です。

図 (行1列7)のマスに関係する数字

表(行1列1)の候補数字

同様にして,ひととおりすべてのマスについて候補数字から使われている数字を消した結果は,次の図のようになります。(行1列7)のマスのように候補数字が1個になったマスをピンク色で塗りました。これが消去法の1回目の結果です。

図 消去法の1回目

消去法の第2回目として,候補数字が決定された6個のピンク色のマスを元にして,残った候補数字を消すことができます。例えば,(行1列7)のマスは,7と決定されたので,ルールから,このマスと同じ行(行1)の他のマスには7を入れることができません。行1には,候補数字として7を含むマスが2カ所あります。例えば,(行1列1)の候補数字は1と7ですが,7を入れることはできなくなったので7を消すと候補数字は1だけとなり,このマスも決定できます。同様に,(行1列9)の候補数字は7と9なので,7を消して9だけが残り,決定できます。(行1列7)と同じ列7をみていくと,7を含むマスが3カ所あります。同様にして,(行1列7)と同じブロック3には決定できるマスは4カ所あります。このようにして,すべてのピンク色のマスに関係する候補数字の中で消してもよい数字を消すと,次の図のようになります。

図 消去法の2回目

候補数字が減って候補の数が1個になったマスに黄色をつけました。新たにマスの数字が決定されると,他のマスの候補数字を減らすことが可能になるので,1回目と同様に決定されたマス(黄色)に関連するマスの候補数字の中に消すことのできる数字がないかどうかをチェックして,候補数字を消していきます。同様の作業を3回目,4回目とくりかえすと候補数がだんだんへって決定できるマスが増え,最終的には次の図のようにすべてのマスの数字を決定することができます。

図 消去法による答え

この消去法は,難しい問題の場合は解けないこともありますが,簡単な問題であれば,あまり考えなくても決まった作業を地道に繰り返せば答えに達する可能性があるのが長所といえます。しかし,単調な作業はしたくないので,表計算アプリのExcelのワークシート上でこの作業を行うことを考えました。これは,Excelの計算機能を利用して消去法の作業を自動化したものです。消去法より少し高度なテクニックも使っています。下のリンクから開いたりダウンロードしたりできるようにしました。計算内容については,「ワークシートの説明」をごらんください。

「Excelのワークシートをダウンロードする。」

Excelのワークシートの説明

ワークシートの使い方は,最も左端にある「問題Q1表」に問題の数字を入力するだけです。「Q1表」には,すでに例題が入力されているので,表の行1列1から行9列9までを範囲指定して,WindowsならDeleteキーで消去し,Macなら右クリックまたは編集メニューで「数式と値のクリア」をおこなってから,解きたい数独の問題の数値を入力するだけです。すると,ワークシートでは自動的に計算が行われているので,ワークシートを右に見ていくと,すべての数字が埋まった解答の表がみつかるはずです。ワークシートでは,最初に高度法による計算を1回行い,次に消去法を12回繰り返します。最後に,答え合わせを行います。ほとんどの問題は12回のくり返しで解けますが,最初の高度法のところで行き詰まってしまうような難しい問題もあります。このような場合には,最初に頭を使って計算を少してつだってやると,あとは自動計算が答えを見つけてくれます。この方法については,後で詳しく解説します。

数独の解法を自動化する方法としては,プログラムにより自動的に計算させる方法もあるのですが,どのような計算をしているのかを誰でも理解できるように,表計算アプリExcelのワークシートを用いることにしました。ExcelでもVisualBasicというプログラムを使えばスマートに自動化できるのですが,私には使いこなせないし,また,誰にでも理解できるものでもないので,使わないことにしました。ワークシートに書き込んだ計算式は,簡単に見ることができる長所もありますが,ワークシートでは未知数を使うことができないとか,繰り返し計算を短く表現することができないなどの制約があり,これを補うため工夫をこらした結果,計算式が長く回りくどく,わかりにくくなってしまった,という欠点もあります。

このワークシートで行っている計算は,先に説明した「消去法」をくり返すことを基本にしていますが,少し難しい問題でも解けるように,最初に少し高度な方法を使っています。これをここでは「高度法」と呼ぶことにします。「高度法」の考え方は,おおよそ次のとおりです。

  • 高度法

まず,候補数字が2個の数字NとMのマスが同じ行,列またはブロックに二つあるとき,二つの数字がどちらのマスに入るかはその時点ではわかりませんが,いずれはどちらかのマスにどちらかの数字が入ることは明らかなので,他のマスに対しては二つの数字は決まったのと同じことになります。つまり,他のマスには二つの数字を使うことはできないということになり,他のマスの候補数字を二つも多く消去することができることになりますから,それだけ答えに近づくことができることになります。ここでは候補数字が2個の場合を例に説明しましたが,候補数字の数が3個,4個の場合もあります。そこで,このような場合を例題を用いて説明します。

  • Nつ子と変則Nつ子

次の図は,「Nつ子」と「変則Nつ子」を説明するための候補数字の表です。説明を分かりやすくするために一部のマスにしか数字が入っていません。

図 ある問題の候補数字の一部

・ Nつ子

行1には,17が2カ所あり,これらのマスには1または7のどちらかが必ず入ることになるので,それ以外のマスには1と7を使うことはできません。行1の列2は12ですが, 1を使うことができないので2が残り,これで決定です。同様に,行1列7の候補数字57は,7が消えて5で決定することができます。行2は,その結果を示したものです。この例のように,同一の行,列またはブロック内の2つのマスの候補数字が等しい2桁の数字であるような場合を「2マスの予約法」(http://matome.naver.jp),「二国同盟」(http://www.sudokugame.org) や「双子」といわれています。

同じようにして,同じ行,列またはブロックに等しいN桁の候補数字のマスがN個あるときも,他のマスにこれらの数字を使うことはできません。ただし,N<9です。これらを双子の呼び方にならって「Nつ子」と呼ぶことにします。図の行4には,4つ子の例を示しました。候補数字2689が4つのマスで等しいので,他のマスではこれらの数字を候補として使うことができず,行5のように候補数字の一部を消去することができます。

・ 変則Nつ子

図の7の行7は,変則双子の例です。行1と異なるのは,列5の17に余分な数字3が入って137になっていることです。しかし,行7には,1と7の両方を含むマスは,やはり2カ所なので,どちらかに1残ったマスに7が入ることは双子と同じで,他のマスにこれらの数字を使うことができないことも同じです。あえて呼び名をつける必要もないかもしれませんが,発展性もありそうなので,「Nつ子」に他の余分な数字が混入したものを「変則Nつ子」と呼ぶことにしました。

以上のような考え方を応用してワークシートでは自動計算を行なっています。計算の全体的な流れを整理すると次の図のようになります。

図 Excelのワークシートによる自動計算の流れ

  • ワークシートで答えが見つからない場合の対処法(試行錯誤法)

先に説明したように,難しい問題の場合は,最初の高度法で一つもマスが埋まらないこともあります。高度法では,候補数字が2個のマスを利用しているのですが,これでも解けない場合は,候補数字が3個のもの,4個のもの,というようにさらに高度な手法を用いることも考えられますが,てっとりばやいのは,候補数字が2個のマスに試しに数字を入れてみることです。ワークシートのE表は,候補数字が2個のマスを探して候補数字を表示したものです。この表を見ると,候補数字が2個のマスがいくつかあるはずです。さらに,候補数字が2個のマスの位置と,その数字の組み合わせがわかります。例えば,(行1列6)のマス(A)に「79」,(行3列6)のマス(B)には「34」と表示されているとします。Aのマスには7か9のどちらかの数字が入り,Bのマスには3か4のどちらかの数字が入ります。そこで,試しに,計算が行き詰まったワークシートで,Aのマスに7,Bのマスに3を入れてみます。つまり,ワークシートの「問題Q1表」の(行1列6)のマスに7を,(行3列6)のマスに3を入力します。すると,少し計算が進みます。計算が終わればラッキーということですね。

しかし,それでは自動的に解いたことにはなりません。「世界一難しい数独」のページでは,試行錯誤法を自動的に行う解法について述べます。