第7講 繰り返し処理・if文・配列を総動員して3次魔方陣を自動生成する!
第8話 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
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 |
○ | ○ | ○ |
○ | ○ | ○ |
この場合1+2+3=6で15になっていませんから、
先ほどの青色が無視されて、
1 | 2 | 4 |
○ | ○ | ○ |
○ | ○ | ○ |
1 | 2 | 5 |
○ | ○ | ○ |
○ | ○ | ○ |
1 | 2 | 6 |
○ | ○ | ○ |
○ | ○ | ○ |
というように先の升に進まずに、
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次魔方陣生成プログラムを完成させましょう。
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部へ
本サイトトップへ