第17講 普遍版魔方陣自動生成プログラムの高速化
第1話 高速化を図るには?
第16講で作った普遍版魔方陣自動生成プログラムの普遍版とは名ばかりで、
現実には4次が限界です。
1次魔方陣は意味がありませんし、2次魔方陣は存在しませんから、
実際にできるのは3次と4次のみです。
5次以上を作らせるには、さらなる高速化を工夫しなければなりません。
これからさまざまな工夫を凝らし、最終的には26次魔方陣でも1秒で数百の単位で作れるようになります。
前回作った普遍版魔方陣自動生成プログラムは何千京倍(京は1億の一万倍)を遙かに上回る超高速プログラムに変身していきます。
現在のままなら26次魔方陣は千億年計算させ続けても1個も発見できません。
それが工夫次第で1秒で数百も作成できるようになるのです。
そこにプログラムの醍醐味があります。
さて、今回の工夫はちょっとした工夫にすぎません。
しかし、その工夫で4次魔方陣なら16倍化の高速化
5次魔方陣なら1万倍を超える高速が可能になります。
そして、それにランダムを加えると6次魔方陣までが作成可能となります。
とって6次魔方陣をすべて作らせるには宇宙時間(宇宙の始まりから終わりまで)は必要でしょうから、
途中で止める前提です。
時間割は、現在高校においては大変複雑なものになっています。
選択あり、習熟あり、場所の制約あり、チーム・ティーチングありで大変なパズルです。
春休みには、時間割担当の先生は毎日缶詰になり時間割の作成を行います。
時間割を組むコツは、条件のきついコマ(例えば、体育=場所の制約、チーム・ティーチング)を先に入れるのことです。
条件の緩いコマを先に入れて、条件のきついコマが残ってしまうと動きがとれなくなってしまうからです。
条件の緩いコマは、比較的自由に動かせるのに対して条件のきついコマは動かすのが難しいからです。
難問を解くとき、難しいところからクリアするのが鉄則です。
では、魔方陣の場合どこが条件が厳しいでしょうか。
a | b | c | d |
e | f | g | h |
i | j | k | l |
m | n | o | q |
対角線上のセルと対角線以外のセルを比較すると、
対角線上にないセルは
a+b+c+d=14
b+f+j+n=14
と2つの条件を満たせばよいに対して
対角線上のセルは
a+b+c+d=14
a+e+i+m=14
a+f+k+f=14
と3つの条件をクリアしなければなりません。
したがって、条件のきつい方は対角の方です。
そこでセル番号を
0 | 1 | 2 | 3 |
4 | 5 | 6 | 8 |
9 | 10 | 11 | 12 |
12 | 13 | 14 | 15 |
から
0 | 8 | 9 | 4 |
10 | 1 | 5 | 11 |
12 | 6 | 2 | 13 |
7 | 14 | 15 | 3 |
付け替えます。
グローバル変数
int a[10][10],x[100],y[100];
を用意して
0 | 1 | 2 | 3 | |
0 | 0 | 8 | 9 | 4 |
1 | 10 | 1 | 5 | 11 |
2 | 12 | 6 | 2 | 13 |
3 | 7 | 14 | 15 | 3 |
x[0]=0、x[1]=1、x[2]=2、x[3]=3、x[4]=3、x[5]=2、x[6]=1、x[7]=0、x[8]=1、x[9]=2、x[10]=0、x[11]=3、x[12]=0、x[13]=3、x[14]=1、x[15]=2
y[0]=0、y[1]=1、y[2]=2、y[3]=3、y[4]=0、y[5]=1、y[6]=2、y[7]=3、y[8]=0、y[9]=0、y[10]=1、y[11]=1、y[12]=2、y[13]=2、y[14]=3、y[15]=3
と対応させるにはどうしたらよいでしょうか。
もちろん、普遍版ですからnが何であっても対応できる一般的なものでなければなりません。
こんな難しい問題に答えなど存在するのでしょうか。
こんな難しい迷宮に出口などあるのでしょうか。
C言語 C++講義第1部へ
VB講義へ
VB講義基礎へ
vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)