第6講 数独を作ろう!
第2話 ラテン方陣解答例


解答例は、順列方陣その1です。
プログラムソースのメインは、次のようになっています。
Sub sakusei(g As Integer)

  Dim i, j, k, l, hh, wa As Integer
  j = g Mod n
  i = Int(g / n)

  For k = 1 To n * n
    mah(i, j) = k
    'Cells(i + 5, 1 + j) = mah(i, j)
    hh = 0
    If tyouhukuhantei(k - 1) = 1 Then GoTo owari
    tyouhukuhantei(k - 1) = 1
    hh = 1
    If g + 1 < n * n Then
      sakusei (g + 1)
    Else
      cn = cn + 1
      hyouji
    End If
owari:
    If hh = 1 Then tyouhukuhantei(k - 1) = 0
  Next
  mah(i, j) = 0


End Sub
非常に簡単なプログラムですね。

では皆さん、次にラテン方陣の作成に挑戦しましょう。

1 2 3 4 5 6 7 8 9
2 1 4 3 6 5 8 9 7
3 4 1 2 7 8 9 5 6
4 3 2 1 8 9 6 7 5
5 6 7 8 9 1 2 3 4
6 5 8 9 3 7 4 1 2
9 8 5 7 2 4 1 6 3
7 9 6 5 1 2 3 4 8
8 7 9 6 4 3 5 2 1

ラテン方陣とは上の方陣のようにどの列(縦)にも、
どの行(横)にも同じ数字が並ばず、
1から9までの数字が1つずつ入っている方陣を言います。

さらに、対角線の条件を加えたラテン方陣を
私は、魔方陣の特殊種と名付けています。

1 4 7 2 6 5 3
3 2 1 5 4 7 6
6 5 3 7 2 1 4
7 6 5 4 3 2 1
4 7 6 1 5 3 2
2 1 4 3 7 6 5
5 3 2 6 1 4 7

これに順列法を組み合わせた特殊種法×順列法は
信じられない速度(1秒で何百という単位)で魔方陣を作成します。

特殊種法と順列法の組み合わせによる魔方陣の作成も講義予定の1つです。


さて、皆さんラテン方陣を作成しましょう。
これを作るには、1から9までの数字をそれぞれ9個ずつ用意して、
どの列にもどの行にも同じ数字が並ばないようにします。

第1話へ 第3話へ

VB入門講義応用編トップへ

VB入門講義トップへ