第8講 社員が自分自身に仕事を命令する=メソッドの再帰的使用
第9話 汎用的な魔方陣自動生成プログラムに時間計測機能を加える
を実現するプログラム例
#! ruby -Ks
print "何の順列を生成するのかをキーボードから入力して下さい。n="
n=gets.to_i
h=Time.now
print n,"次順列の生成\n"
def f(a,g,n,cn)
y=g/n
x=g%n
i=1
(n*n).times do
h=1
if g>0 then
for j in 0..(g-1)
jy=j/n
jx=j%n
if i==a[jy][jx] then
h=0
break
end
end
end
if h==1 then
a[y][x]=i
end
if h==1 then
if x==n-1 then
w=0
for j in 0..(n-1)
w+=a[y][j]
end
if w!=n*(n*n+1)/2 then
h=0
end
end
end
if h==1 then
if y==n-1 then
w=0
for j in 0..(n-1)
w+=a[j][x]
end
if w!=n*(n*n+1)/2 then
h=0
end
end
end
if h==1 then
if x==0 && y==n-1 then
w=0
for j in 0..(n-1)
w+=a[j][n-1-j]
end
if w!=n*(n*n+1)/2 then
h=0
end
end
end
if h==1 then
if x==n-1 && y==n-1 then
w=0
for j in 0..(n-1)
w+=a[j][j]
end
if w!=n*(n*n+1)/2 then
h=0
end
end
end
if h==1 then
if g+1<n*n then
cn=f(a,g+1,n,cn)
else
hy(a,n)
cn+=1
end
end
i+=1
end
return cn
end
def hy(a,n)
i=0
n.times do
j=0
n.times do
print a[i][j]," "
j+=1
end
print "\n"
i+=1
end
print "\n"
end
a=[0]
i=0
n.times do
a[i]=[[0]]
i+=1
end
print n,"次魔方陣が",f(a,0,n,0),"個生成されました。"
o=Time.now
print "魔方陣の全生成にかかった時間は",o-h,"秒です。\n"
参考ダウンロード添付ファイル
今回もピンクが変更箇所です。
これで、第8講を終了したいと思います。
『メソッドの再帰的使用=社員が自分自身に命令する』は、
結局分身の術だったのです。
第9講では、ユークリッド互除法を扱います。
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部へ
本サイトトップへ