第7講 繰り返し処理・if文・配列を総動員して3次魔方陣を自動生成する!
第8話 3次方陣の自動生成プログラム
8745
を実現するプログラム例
#! ruby -Ks
print "3次方陣の生成\n"
a=[0]
def f1(a,i)
 a[0]=i
end
def f2(a,i)
 if i==a[0] then
  return 0
 end
 a[1]=i
 return 1
end
def f3(a,i)
 for j in 0..1
  if i==a[j] then
   return 0
  end
 end
 a[2]=i
 return 1
end
def f4(a,i)
 for j in 0..2
  if i==a[j] then
   return 0
  end
 end
 a[3]=i
 return 1
end
def f5(a,i)
 for j in 0..3
  if i==a[j] then
   return 0
  end
 end
 a[4]=i
 return 1
end
def f6(a,i)
 for j in 0..4
  if i==a[j] then
   return 0
  end
 end
 a[5]=i
 return 1
end
def f7(a,i)
 for j in 0..5
  if i==a[j] then
   return 0
  end
 end
 a[6]=i
 return 1
end
def f8(a,i)
 for j in 0..6
  if i==a[j] then
   return 0
  end
 end
 a[7]=i
 return 1
end
def f9(a,i)
 for j in 0..7
  if i==a[j] then
   return 0
  end
 end
 a[8]=i
 return 1
end
def g(a)
 for i in 0..8
  if i==3 then
   print "\n"
  end
  if i==6 then
   print "\n"
  end
  print a[i]," "
 end
 print "\n"
 print "\n"
end
for i in 1..9
 f1(a,i)
 for j in 1..9
  h1=f2(a,j)
  if h1==1 then
   for k in 1..9
    h2=f3(a,k)
    if h2==1 then
     for l in 1..9
      h3=f4(a,l)
      if h3==1 then
       for m in 1..9
        h4=f5(a,m)
        if h4==1 then
         for n in 1..9
          h5=f6(a,n)
          if h5==1 then
           for o in 1..9
            h6=f7(a,o)
            if h6==1 then
             for p in 1..9
              h7=f8(a,p)
              if h7==1 then
               for q in 1..9
                h8=f9(a,q)
                if h8==1 then
                 g(a)
                end
               end
              end
             end
            end
           end
          end
         end
        end
       end
      end
     end
    end
   end
  end
 end
end
参考ダウンロード添付ファイル

さて、3次方陣の自動生成が出来れば、
3次魔方陣自動生成まで後1です。
魔方陣にするには、

0 1 2
3 4 5
6 7 8

a[2],a[5],a[8]のそれぞれの場合に、
横の合計が
(1+2+3+4+5+6+7+8+9)÷3=15
になっているかをチェックします。
また、
a[6],a[7],a[8]のそれぞれの場合に、
縦の合計が15になっているか調べます。
さらに、
a[6],a[8]のそれぞれの場合に、
対角線の合計がやはり15になっているかを検査します。
例えば、a[2]ときには横合計が15になっていない場合には
h3=0としてやれば
    if h2==1 then
     for l in 1..9
      h3=f4(a,l)
      if h3==1 then
       for m in 1..9
        h4=f5(a,m)
        if h4==1 then
         for n in 1..9
          h5=f6(a,n)
          if h5==1 then
           for o in 1..9
            h6=f7(a,o)
            if h6==1 then
             for p in 1..9
              h7=f8(a,p)
              if h7==1 then
               for q in 1..9
                h8=f9(a,q)
                if h8==1 then
                 g(a)
                end
               end
              end
             end
            end
           end
          end
         end
        end
       end
      end
     end
    end
のところが、実行されずにlが先に進みます。

この場合1+2+3=6で15になっていませんから、
先ほどの
青色が無視されて、




というように先の升に進まずに、
lを進めてくれるわけです。
具体的には、
     h2=f3(a,l)
     if h2==1 then
の2行の間に次のように挿入すればよいのです。
     h2=f3(a,l)
     
if h2==1 then
      w=0
      for l in 1..2
        w+=a[i]
      end
      if w!=15 then
       h2=0
      end
     end

     if h2==1 then
では、皆さん横合計または縦合計または対角線合計の検査を
上を参考に必要なところにすべて入れて、
3次魔方陣生成プログラムを完成させましょう。
ggwwed
eww

第7話へ 第9話へ


004

eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
vc++講義へ
vba 2013 2010 2007 入門へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
専門用語なしの C言語 C++ 入門(Visual C++ 2010で学ぶ C言語 C++ 入門)
専門用語なしの excel vba マクロ 入門 2013 2010 2007 対応講義 第1部
eclipse java 入門へ
excel 2016 vba 入門第1部へ
本サイトトップへ