第3講 試行錯誤法でヒント数0数独の解答を作る(2)
第8話 自然に数字を配置するには①



前回作った数独解答から一定の法則に従って、

空欄にして(数字を抜いて)いくと、空欄数が40程度までは唯一解であることは確実です。

数独(これからは問題という意味で数独という言葉を使います)らしくなるか試しに

空欄を作ってみましょう。

というか逆です。

空欄にしな方を選び出せば空欄にする場所は自動的に決定です。

結局はヒントとなる数字をどのように配置するのかという話になります。


どのようにヒントの数字を入れていくかについて、

始まる数と飛び方(いくつ飛ぶか)を指定して81回繰り返すと、

・・・・・と不思議なことが起きます。

例えば、はじめを10として7飛びにすると
1回目 2回目  3回目
10  →17  →24→・・・・

ただし、72の次は82になってしまいますので、

飛び方は(10 + 7 * n) % 81(nは回数)とします。

すると不思議なことが起こります。

えっ!?どこが不思議なの?
と思いますよね。

エクセルVBAでプログラムを組んで


Private Sub CommandButton1_Click()
  Dim h As Integer, i As Integer, st As Byte, tb As Integer
  h = 1 '真偽判定
  st = Cells(9, 15)
  tb = Cells(11, 15)
  Dim a(81) As Byte
  For i = 0 To 80
    a(i) = 0
  Next
  For i = 0 To 80
    Cells(2 + 2 * Int(i / 9), 2 + Int(i Mod 9)) = i + 1
  Next
  For i = 0 To 80
    Cells(3 + 2 * Int(i / 9), 2 + Int(i Mod 9)) = (st + tb * i) Mod 81
  Next
  For i = 0 To 80
    a(Cells(3 + 2 * Int(i / 9), 2 + Int(i Mod 9)) - 1) = 1
  Next
  For i = 0 To 80
    If a(i) = 0 Then
      Cells(7, 12) = "異常があります。"
      h = 0
    End If
  Next
  If h = 1 Then Cells(7, 12) = "すべて正常でした。"
End Sub
Private Sub CommandButton2_Click()
  Selection.ClearContents
  Range("B2:J23").Select
  Selection.ClearContents
  Range("L7").Select
  Selection.ClearContents
  Range("A2").Select
End Sub
参考ファイル
上のファイルをクリックしてください。
マイクロソフトによってブロックされている可能性がありますから、
ブロックの解除の方法をお教えしますから、手順の通りにやってください
上のファイルをクリックしたら、エクスプローラーを起動して

ダウンロードをダブルクリックします。

そして赤枠をダブルクリックして

すんなり起動できている場合にはブロックはされていない可能性が高いですが、
念のために消去ボタンと実行ボタンを押して動けばブロックはされていないことになります。

厄介なのは編集を有効にするがあるときです。
このときは編集を有効にするボタンを押してから閉じてください。
私の場合にはブロックがされていませんでしたから、
ブロックされていた別のファイルで説明します。
やり方は同じですから心配はいりません。
エクスプローラー(タスクバーにあるこれをクリック)をクリックして
total-ver2(私の場合何回もクリックしたために(8)という余計なものが付いていますが)ダブルクリックします。
して開きます。

この画面が出てきたら編集を有効にするのボタンをおして、エクセルを閉じます。

それで、total-ver2(私の場合何回もクリックしたために(8)という余計なものが付いていますが)を右クリックします。そして、プロパティをクリックします。下の方にある許可をするにチェクマークを入れて入れてOKボタンを押します。そして、total-ver2をダブルクリックしてください。ヒント数とタイプに適当な数字を入力して、
作成ボタンを押して問題が生成されれば成功です。念のために消去ボタンも押して、マクロが作動していることを確認してください。

話を戻しましょう。

O9とO10にいろいろな整数を入れて、実験してみましょう。

例えば、始めの位置を15、何飛びを11で実験します。

すると今回も

始めの位置を4、何飛びを17として実行ボタンを押すと、

今回もすべて正常でしたです。

正常とは何を意味していると思いますか。

異常と出る場合を示しましょう。

始めの位置を8、何飛びを12として実行ボタンを押すと


異常があるとでました。

上をよく見ると何が異常なのかわかるはずです。

違いはすべて正常の方は0から80までの数字がすべてそろっているのに対して、

異常があると出ている方は、欠けている数字がたくさんあります。

実は始めの位置は不思議な現象には関係しておらず、

いくつ飛びにするかにみそがあります。
極端な例は

なんと9種類の数字しかなくて、欠番は72通りもあるという結果です。

なぜこの問題に私がこだわっているのか、皆さんの中には疑問に思う人もいるでしょう。

ですが、この問題をヒントとなる数を配置するときに困ることになるのです。

VBAコードをさらに改良して
Private Sub CommandButton1_Click()
  CommandButton2_Click
  Dim h As Integer, i As Integer, st As Byte, tb As Integer
  h = 1 '真偽判定
  st = Cells(9, 15) 'スタート地点の取得
  tb = Cells(11, 15) '飛び方の指定
  Dim a(81) As Byte
  For i = 0 To 80
    Cells(2 + 2 * Int(i / 9), 2 + Int(i Mod 9)) = i + 1 '番号の表示
  Next
  For i = 0 To 80
    a(i) = (st + tb * i) Mod 81
  Next
  For i = 0 To 80
    Cells(3 + 2 * Int(a(i) / 9), 2 + a(i) Mod 9) = "〇"
  Next
End Sub
Private Sub CommandButton2_Click()
  Selection.ClearContents
  Range("B2:J23").Select
  Selection.ClearContents
  Range("L7").Select
  Selection.ClearContents
  Range("A2").Select
End Sub
参考ファイル

では実験しましょう。

消去ボタンを押して実行ボタンを押すと

上の数字が部屋番号に変更されていることに注意してください。

欠番が一目瞭然です。

小さい数字が部屋番号に変更されていることに注意してください。

丸が付いていないところが欠番です。

今度はすべて網羅されています。

何が運命を分けるのでしょうか。

第7話へ 第9話へ

トップへ