第7講 繰り返し処理・if文・配列を総動員して3次魔方陣を自動生成する!
第9話 3次魔方陣自動生成
を実現するプログラム例
#! 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講より、遙かに簡単ですよ。
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部へ
本サイトトップへ