第12講 プロシージャの再帰的使用によって魔方陣を自動生成する
第6話 セル番号の付け替え
前話の答えは

0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15

0 8 9 4
10 1 5 11
12 6 2 13
7 14 15 3

とセル番を変更すれば良いのです。
これでおそらく4次の段階で1000倍
5次なら1万倍以上速くなります。
なぜでしょうか。
答えは30行ほど下。




























答え

a b c d
e f g h
i j k l
m n o p

各セルの中で条件が強いセルを考えてください。

a b c d
e f g h
i j k l
m n o p

例えば

b

のセルは
a+b+c+d=34
とb+f+j+k=34の2条件を満たせば良いのに対して、

k

のセルは
c+g+k+o=34
i+j+k+l=34
a+f+k+p=34
の3条件を満たす必要があります。
つまり、
対角線上のセルはすべて3つの条件を見たさなければならないのに対して、
対角線以外のセルは2つの条件を満たせば良いのです。

私たち高校教諭は、
毎年春休みに時間割を組まなければなりません。
これが年々大変になってきています。
習熟・選択・合同などいろいろな
授業形態が取られるようになっているからです。
実は、時間割を組むコツは条件の厳しい枠から埋めていくです。
分割・合同で複数のクラスに渡り、
教室が制限されていて、
しかも、非常勤の場合時間も制約されている授業があります。
最初に単位数が多く1人で持っている授業を先に入れてしまうと、
条件の厳しい駒が身動きできなくなってしまいます。
条件の厳しい駒を先に入れて、
単位数の多い単駒(1人で1教室の授業)を後から入れるのが、
ミソです。
行き詰まったとき、
単駒は比較的自由に動かせるからです。

条件の厳しいところからクリアする!
これは時間割だけでなく、
どんな問題にも適応できる絶対原則です。
厳しいところから埋めていくと場合の数が、
1/1000にも1/10000にもなるからです。
ですから、セル番号を

0 8 9 4
10 1 5 11
12 6 2 13
7 14 15 3

と付け替えるだけで生成時間が
1000倍ぐらいになったりする訳です。

さて、問題はその番号振り直しをどのようにするかです。
これは、難問ですよ。
というのは、

n=3のとき

0 5 3
6 1 7
4 8 2

n=4のとき

0 8 9 4
10 1 5 11
12 6 2 13
7 14 15 3

n=5のとき

0 9 10 11 5
12 1 13 6 14
15 16 2 17 18
19 7 20 3 21
8 22 23 24 4

n=6のとき

0 12 13 14 15 6
16 1 17 18 7 19
20 21 2 8 22 23
24 25 9 3 26 27
28 10 29 30 4 31
11 32 33 34 35 5

n=7のとき

0 13 14 15 16 17 7
18 1 19 20 21 8 22
23 24 2 25 9 26 27
28 29 30 3 31 32 33
34 35 10 36 4 37 38
39 11 40 41 42 5 43
12 44 45 46 47 48 6

こんな複雑な動きをするからです。
最初私が組んだとき、
偶数の場合と奇数の場合とに場合分けをして、
If文でかなり複雑なプログラムを組みましたが、
読者の
仮屋崎さんから
天才的な番号付けプログラムのアイデアが寄せられました。





第5話へ 第7話へ



トップ

初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門

数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ