- 投稿 2016/05/30更新 2016/06/04
- ゲーム
何年か前に数独を解くエクセルを作りました。
こんな感じです。
左側のマスに問題を記入すると、右側の解答マスに解答が現れるというお遊びエクセルです。
今回アップするに際して、あらためてネットで調べてみたところ、数独を解法するソフトやサイトやエクセルがたくさん見つかりました。
いまさら感は否めないのですが、自分としては気に入っている仕上がりとなっているために、公開することにしました。
動かしてみると面白いので暇つぶしにでも遊んで見てください。
ただし、残念なことに、このエクセルはまだ完全ではないのです(>▽<)
ほとんどの数独を解くことが出来るようにはなっているのですが、解けないパターンが少なからず存在したりします。
そのようなパターンを私自身が解くことが出来ないために、それを数式化できていないという単純な理由です。
(数独の解法解説を読んでも、いまだに理解できていない部分だ。。。)
ネットの中を探ってその方法を数式化する手もあるわけですが、自分の楽しみのためにエクセル化しているという目的から、ここはあくまでも自力で解決することに価値を置きたいと思うところです。
というわけで、追加の数式は将来の楽しみとして取っておくことにしています。
数独解法エクセルはこちらからダウンロードできます。
エクセルを開くときに「マクロを有効」として下さい。
数独解法エクセルの構造は?
ちょっとだけ中身の解説をしてみますと、
・15行目以下が解法の数式箇所 となっており、
・横一列に4種類の表を用意して、
・同じ表が下の行にも複数用意され、
・下の表に進むにしたがって、ピンク色で示された答えの数字が順次得られ、
・全マスが埋まった表の場所を見つけて、
・上部の解答マスに結果を取り出す
という構成となっています。
要するに、人間が順を追って解いていくのと同じ手順を再現しています。
表を下にスクロールしていくに従って解いている過程が見えるようになっているところは、何か人間的な雰囲気を感じさせてくれます。
世の中に数多くの解法プログラムやサイトはあるものの、私は自分の作ったこの人間っぽい数独解法エクセルを愛してやみません。
もっとも、作ったことで満足してしまっているために、作成後はこのエクセルを使うことはなく、もっぱら紙の上での数独に取り組んでいるわけではありますが。
数式としては、
・当選確実で、その数字以外には当てはまらないものを見つける部分
=IF(B5>0,B5,IF(M16+V17+AH20=0,0,""))
・候補数字の中から一つだけ浮かび上がる数字を探す部分
=IF(M17<>"",M17,AvailableNumber(M17:U17,M17:M25,M17:O19))
とに分けられており、後者の候補数字の数式では、複数の候補数字を並べて表示するための定義関数「AvailableNumber」をVBAで作って処理させています。
たとえば、候補数字が2、3、9であれば、マスに239と3桁の数字を表示させる関数です。
以下にこの定義関数のVBAを掲載しておきます。
Function AvailableNumber(GyouCell As Range, RetuCell As Range, MasuCell As Range) As Long
Dim i As Integer '調べる数字
Dim j As Long '存在できる数字を j とする。最大値が123,456,789となるのでLong型とする。
j = 0
i = 1
For i = 1 To 9 '調べる数字を1から9まで繰り返す
If Application.WorksheetFunction.CountIf(GyouCell, i) > 0 Or Application.WorksheetFunction.CountIf(RetuCell, i) > 0 Or Application.WorksheetFunction.CountIf(MasuCell, i) > 0 Then
GoTo Skip 'iがあればNEXTに飛ぶ
Else
j = j * 10 + i 'iが無ければこのセルに存在できるのでjに代入する
End If
Skip:
Next
AvailableNumber = j 'セルの値に j を入力する。
End Function
本日は数独を解法するエクセルを掲載しました。