第10講 プロシージャの再帰的使用による魔方陣の自動生成
第7話 魔方陣生成ソフトの改良のヒント
第5話と第6話のコードだと
1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 |
に到達した時点で行合計・列合計・対角線合計が同じになるかを検査していますが、
ここから
1 | 2 | 14 | 16 |
3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 |
11 | 12 | 13 | 15 |
まではまったく無駄な検索をしています。
この次の
1 | 2 | 15 | 16 |
3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 |
においてはじめて1行目の合計が4×(4×4+1)÷2=34になって、
魔方陣の場合の横合計に一致するからです。
検査をgが15(これは最後のマスに対応します。gは0から始まるからです。)
になった時点で検査していることが問題なのです。
効率的に魔方陣を作り出すためには
0 | 1 | 2 | 3 |
4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 |
(紺の数字がgに対応しています。)
の色の付いている部分で検査すべきです。
色の種類が分けてあるのは、
12,15では対角線合計検査までしなければならないからです。
では、色の付いている段階で検査して
無駄な場合の検索はしないように工夫しましょう。
ノーヒントでは難しいですから、
Sub f(g As Integer)
Dim i, j, k, h, w, x, y As Integer 'hhは不要なので削除
y = Int(g / n)
x = g Mod n
For i = 0 To n * n - 1
If g = 0 Then mah(y, x) = i + 1
h = 1
If g > 0 Then
For j = 0 To g - 1
If mah(Int(j / n), j Mod n) = i + 1 Then
h = 0
Exit For
End If
Next
If h = 1 Then mah(y, x) = i + 1
End If
ここに付け加えコードを入れる。
付け加えコードではxとyが活躍しますし、
w =0 とh = 0 という命令文が
全部で4回出てきます。また、
if h == 1 Then
if*Then
数行
End If
End If
も3回現れます。
w = 0 とh = 0 という命令文は3回にそれぞれ1回ずつ登場します。
If h = 1 Then
If g + 1 < n * n Then
f (g + 1)
Else
cn += 1
For j = 0 To n - 1
For k = 0 To n - 1
’二桁への対応
If mah(j, k) < 10 Then Console.Write(" {0:d} ",
mah(j, k))
If mah(j, k) >= 10 Then Console.Write("{0:d} ",
mah(j, k))
Next
Console.WriteLine()
Next
Console.WriteLine()
End If
End If
Next
End Sub
という骨格を示しておきます。
xとyが活躍する理由は
0 | 1 | 2 | 3 |
4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 |
にあります。考えてください。
今回の改良による効果は実験していませんが、
おそらく5000倍程度のスピードアップが期待できます。
’二桁への対応
If mah(j, k) < 10 Then Console.Write(" {0:d} ",
mah(j, k))
If mah(j, k) >= 10 Then Console.Write("{0:d} ",
mah(j, k))
の部分は今回の改良によってはじめて4次魔方陣まで出来るようになりして、
二桁への対応が必要になったからです。
第6話へ 第8話へ
初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc** c言語 c** 入門 初心者 基礎から応用まで
eclipse c** 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C**入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC**による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ