第5講 問題における数字の配置をいかにするか?
第6話 上下対称に配置する

b上下対称に配置の解答例
'hntはヒント数、tbは飛び、iz(80)とjz(80)はそれぞれy座標とx座標
Dim hnt As Byte, iz(80) As Byte, jz(80) As Byte
Private Sub CommandButton1_Click()
  CommandButton2_Click
  hnt = Cells(4, 15)
  retutaisyou '上下対称に配置する場合の座標作りと表示
End Sub
Sub hitaisyou() '非対称に配置する場合の座標作りと表示
  Dim i As Integer, a As Integer, w As Integer, tb As Integer, h As Byte
  w = Int(81 * Rnd) 'はじめの位置をランダムに取得
  Do While 1 '81と互いに素になるtbを自動的に探す。
    tb = Int(36 * Rnd)
    h = 1
    For i = 2 To tb
      If i * i > tb Then Exit For
      If (81 Mod i) = 0 Then
        If (tb Mod i) = 0 Then
          h = 0
          Exit For
        End If
      End If
    Next
    If h = 1 Then Exit Do
  Loop
  For i = 0 To hnt - 1
    a = (w + tb * i) Mod 81 'aはセル(箱)番号を表す変数
    iz(i) = Int(a / 9)
    jz(i) = a Mod 9
    Cells(4 + iz(i), 2 + jz(i)) = "*"
  Next
End Sub
Sub retutaisyou() '上下対称に配置する場合の座標作りと表示
  Dim i As Integer, a As Integer, w As Integer, tb As Integer, h As Byte
  w = Int(36 * Rnd) 'はじめの位置をランダムに取得
  Do While 1 '36と互いに素になるtbを自動的に探す。
    tb = 2 + Int(34 * Rnd)
    h = 1
    For i = 2 To tb
      If i * i > tb Then Exit For
      If (36 Mod i) = 0 Then
        If (tb Mod i) = 0 Then
          h = 0
          Exit For
        End If
      End If
    Next
    If h = 1 Then Exit Do
  Loop
  If hnt Mod 2 = 0 Then 'ヒント数が偶数の場合
    For i = 0 To Int(hnt / 2) - 1 '中央行以外を上下対称に配置
      a = (w + tb * i) Mod 36 'セル番号を35以下に限定
      iz(i) = Int(a / 9) '中央行より上の行のy座標
      jz(i) = a Mod 9 '中央行より上の行のx座標
      iz(i + Int(hnt / 2)) = 8 - Int(a / 9) '中央行より下の行のy座標
      jz(i + Int(hnt / 2)) = a Mod 9 '中央行より下の行のx座標
      Cells(4 + iz(i), 2 + jz(i)) = "*"
      Cells(4 + iz(i + Int(hnt / 2)), 2 + jz(i + Int(hnt / 2))) = "*"
    Next
  End If
  If hnt Mod 2 = 1 Then 'ヒント数が奇数の場合
    iz(0) = 4
    jz(0) = Int(9 * Rnd)
    Cells(4 + iz(0), 2 + jz(0)) = "*"
    For i = 0 To Int(hnt / 2) - 1 '中央行以外を上下対称に配置
      a = (w + tb * i) Mod 36 'セル番号を35以下に限定
      iz(i + 1) = Int(a / 9) '中央行より上の行のy座標
      jz(i + 1) = a Mod 9 '中央行より上の行のx座標
      iz(i + 1 + Int(hnt / 2)) = 8 - Int(a / 9) '中央行より下の行のy座標
      jz(i + 1 + Int(hnt / 2)) = a Mod 9 '中央行より下の行のx座標
      Cells(4 + iz(i + 1), 2 + jz(i + 1)) = "*"
      Cells(4 + iz(i + 1 + Int(hnt / 2)), 2 + jz(i + 1 + Int(hnt / 2))) = "*"
    Next
  End If
End Sub
Private Sub CommandButton2_Click()
  Range("B4:J12").Select
  Selection.ClearContents
  Range("L7").Select
  Selection.ClearContents
  Cells(2, 1).Select
End Sub
参考ダウンロード添付ファイル

次の課題は、偶数の場合にも奇数の場合にも中央の行に適切な割合で数字を配置するです。
例えばヒント数が36なら4個の割合です。
揺らぎも考慮に入れてください。
尚、正しくヒント数通りに配置されているかを確認するために、
*の数をカウントして、
031
表示させてください。




第5話へ 第7話へ


トップへ