第10講 プロシージャの再帰的使用による魔方陣の自動生成
第8話 4次魔方陣の全生成を可能にするコード例
Module Module1

  Dim cn, mah(5, 5), n As Integer
  Sub Main() '私は社長だ。
    Console.WriteLine ("これはすべてのn次方陣を求めるソフトです。")
    Console.WriteLine ("何次の方陣を発生させるのかをnに入力し")
    Console.WriteLine ("エンターするとn次方陣がすべて生成されます。")
    Console.Write ("n=")
    n = Console.ReadLine()
    cn = 0
    Dim hj, ow As Object
    hj = Timer
    f (0)
    ow = Timer
    Console.WriteLine("魔方陣生成にかかった時間は{0:f6}秒です。", ow - hj)
    Console.WriteLine("生成された{0:d}次方陣は{1:d}個です。", n, cn)
  End Sub

  Sub f(g As Integer)
    Dim i, j, k, h, w, x, y As Integer
    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
      
If h = 1 Then
        If x = n - 1 Then
          w = 0
          For j = 0 To n - 1
            w += mah(y, j)
          Next
          If w <> Int(n * (n * n + 1) / 2) Then h = 0
        End If
      End If
      If h = 1 Then
        If y = n - 1 Then
          w = 0
          For j = 0 To n - 1
            w += mah(j, x)
          Next
          If w <> Int(n * (n * n + 1) / 2) Then h = 0
        End If
      End If
      If h = 1 Then
        If y = n - 1 And x = 0 Then
          w = 0
          For j = 0 To n - 1
            w += mah(j, n - 1 - j)
          Next
          If w <> Int(n * (n * n + 1) / 2) Then h = 0
        End If
      End If
      If h = 1 Then
        If y = n - 1 And x = n - 1 Then
          w = 0
          For j = 0 To n - 1
            w += mah(j, j)
          Next
          If w <> Int(n * (n * n + 1) / 2) Then h = 0
        End If
      End If

      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

End Module


4次魔方陣7040個の全生成が11分で可能になりました。
このソフトを魔方陣自動生成Ver.1と名付けることにしましょう。
バージョンは講義の進展と共に上がっていきます。
1つバージョンアップするだけで、数十倍から数万倍のスピードアップがされていきます。

以上をもちまして第10講を閉めると同時に、
Visual Studio Community 2017によるVB入門第1部を終了します。
講義はまだまだ続きます。
そして、第3部辺りでゲームプログラミングにも挑戦します。



第7話へ   第11講第1話へ

002

初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc** c言語 c** 入門 初心者 基礎から応用まで
eclipse c** 入門
魔方陣 数独で学ぶ VBA 入門

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C**入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC**による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ