数独-1
今度は数独(ナンバーズとも呼ばれます)をEXCELを使って解くことを考えてみましょう。数独は、9×9のマスにルールに従って1~9の数値をいれるパズルです。ルール1:各横一列には、1~9の数が一つづつ重複することなく入れる。ルール2:各縦一列には、1~9の数が一つづつ重複することなく入れる。ルール3:各ブロックには、1~9の数が一つづつ重複することなく入れる。(ブロックは3×3のマスで、このブロックが3列、3行で、全体の9×9のマスを構成)という単純なものです。表-1上の例題(以前、朝日新聞に掲載された問題)に従って説明します。数値別に上記ルール1~3を纏めると以下の様な表になります。表-2これは "1" についてだけですが、2~9も同じように作ります。表-2には、既に入力済みの数値を記入しておきます。(特に対象の数値のセルは黄色、他は緑色にして有ります)表-2で”D13”セル(表-1で”D3”セル)に"1"が有り、その水平方向(13行目)には"1"が入らないので”H"と表します。同様に、垂直方向(D列)には"1"が入らないので”V"と表します。更に、ブロック(”D11:F13”)には"1"が入らないので”B"と表します。"G15"、”H18"についても、同様に”H"、”V"、"B"を記入します。重複する場合、”H"、"V"、"B"の順に表記することにします。2~9についても同じ様に表を作ります。ここで、EXCELを生かして、関数式で自動表記できるようにしてみましょう。表-1の”A1:I9”セルで、ここに問題及び解答を記入して行きます。これを参照して、表-2を作ります。対象する数値を"A10"に記入します。A11セルに下記の式を記入します。(不等号は図を表記する記号のため使えないので[右大]は右大の不等号に置き換えてください。)=IF(AND(0[右大]A1,A1[右大]10),A1,IF(COUNTIF($A1:$I1,$A$10)=1,"H",IF(COUNTIF(A$1:A$9,$A$10)=1,"V",IF(COUNTIF($A$1:$C$3,$A$10)=1,"B",""))))簡単に解説すると、A1セルが0より大きくて、10より小さい ならば、A1の値をそのまま表示します。(入力済みの数値はそのまま表示)そうでなければ、その次の式を実行します。次の式の”COUNTIF"とは"$A1:$I1"の範囲に$A$10セルの値である"1"の数を数えます。これが1個有る場合、”H"を表示します。無い場合(正確には2個以上有る場合も含みますが、2個以上は無い)は、同じように"A$1:A$9"の範囲に$A$10セルの値である"1"の数を数え、1個有る場合、”V"を表示します。更に、それもない場合、"$A$1:$C$3"の範囲に$A$10セルの値である"1"の数を数え、1個有る場合、”B”を表示します。同様に、"A11:I19"の範囲にセルに応じた式を考えて入力すれば良いのですが、大変なのでコピーします。"A11:C13"の範囲にコピーします。"$"が有るのはコピーしても変わりませんが、無い所は相対的に変化していきます。具体的には、C11セルにコピーされた式は以下になります。=IF(AND(0[右大]C1,C1[右大]10),C1,IF(COUNTIF($A1:$I1,$A$10)=1,"H",IF(COUNTIF(C$1:C$9,$A$10)=1,"V",IF(COUNTIF($A$1:$C$3,$A$10)=1,"B",""))))"$"の無い最初の項や、”V"の参照範囲は自動的にA→Cに変わっていますが、"H"や”B"の参照範囲は変わりません。また、A13セルでは、=IF(AND(0[右大]A3,A3[右大]10),A3,IF(COUNTIF($A3:$I3,$A$10)=1,"H",IF(COUNTIF(A$1:A$9,$A$10)=1,"V",IF(COUNTIF($A$1:$C$3,$A$10)=1,"B",""))))"$"の無い最初の項や、”H"の参照範囲は自動的に1→3に変わっていますが、"V"や”B"の参照範囲は変わりません。次に、D11セルにコピーします。=IF(AND(0[右大]D1,D1[右大]10),D1,IF(COUNTIF($A1:$I1,$A$10)=1,"H",IF(COUNTIF(D$1:D$9,$A$10)=1,"V",IF(COUNTIF($A$1:$C$3,$A$10)=1,"B",""))))ここで、”B"の参照範囲は、ブロックが変わりましたので、$A$1:$C$3 → $D$1:$F$3に変更し、"D11:F13"の範囲にコピーします。同様に、G11セルにコピーし、”B"の参照範囲を$G$1:$I$3に修正し、"G11:I13"の範囲にコピーします。A13をA14に、D13をD14に、G13をG14にコピーします。これらも先と同様にブロックが変わりますので、参照元の1~3行目を4~6行目に変更しブロック内にコピーします。更に7~9行目も同じようにコピー、修正、コピーします。同じく、A20を”2”として、"A21:I29"に"2"を対象する表、さらに同様に3~9を作ります。ここで、"1"の表をコピーして済むように、"A11:I19"の全ての式に有る"$A$10"→”A10"に変更し、それ以外の全ての行番号に"$"を追加します。これを"A21:I29"にコピーします。3~9も同じくコピーします。対象は"$"が無いので相対参照で行番号は自動的に変更されますが、"A1:I9"の参照はそのまま維持されます。こうして、入力可否の表ができます。水平方向、垂直方向、ブロックに入力可(空欄)が一つしかなければ、その対象数が入る事になります。簡単な問題は、これだけで解けますが、これだけでは解けない問題が多数あります。続きは次回に。