第7講 繰り返し処理・if文・配列を総動員して3次魔方陣を自動生成する!
第9話 3次魔方陣自動生成
ggwwed
eww
を実現するプログラム例
#! 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
     w=0
     for l in 0..2
      w+=a[l]
     end
     if w!=15 then
      h3=0
     end
    end
    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
           w=0
           for o in 0..2
            w+=a[o+3]
           end
           if w!=15 then
            h5=0
           end
          end
          if h5==1 then
           for o in 1..9
            h6=f7(a,o)
            if h6==1 then
             w=0
             for p in 0..2
              w+=a[3*p]
             end
             if w!=15 then
              h6=0
             end
            end
            if h6==1 then
             w=0
             for p in 1..3
              w+=a[2*p]
             end
             if w!=15 then
              h6=0
             end
            end
            if h6==1 then
             for p in 1..9
              h7=f8(a,p)
               if h7==1 then
                w=0
                for q in 0..2
                 w+=a[3*q+1]
                end
                if w!=15 then
                 h7=0
                end
               end
              if h7==1 then
               for q in 1..9
                h8=f9(a,q)
                if h8==1 then
                 w=0
                 for r in 0..2
                  w+=a[r+6]
                 end
                 if w!=15 then
                  h8=0
                 end
                end
                if h8==1 then
                 w=0
                 for r in 0..2
                  w+=a[4*r]
                 end
                 if w!=15 then
                  h8=0
                 end
                end
                if h8==1 then
                 g(a)
                end
               end
              end
             end
            end
           end
          end
         end
        end
       end
      end
     end
    end
   end
  end
 end
end

参考ダウンロード添付ファイル

ごめんなさい。
第7講は難しくなりすぎてしまいました。
原因は、for文で3次魔方陣を自動生成しようとしたためです。
10次元ループになってしまい、複雑になってしまいました。
このやり方だと、4次魔方陣だと17(4×4+1)次元ループルになってしまい、
とても挑戦する気力がありませんよね。

実は、良い方法があるのです。
それが、メソッドの再帰的使用という手法なのです。
簡単に言うと、社員はなんと自分自身に命令を下すことが出来るのです。
これを使うと、100次魔方陣であろうと、
2次元ループで済んでしまいます。
もちろん、100次魔方陣を今回の方法でやろうとすると、
100×100+1=10001次元ループになってしまいますが、
それが、たったの2次元で出来る夢の方法なのです。
次講は、この社員が自分に命令する、
メソッドの再帰的使用を学びます。
第7講より、遙かに簡単ですよ。



第8話へ 第8講第1話へ


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部へ
本サイトトップへ