第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文でかなり複雑なプログラムを組みましたが、
読者の仮屋崎さんから
天才的な番号付けプログラムのアイデアが寄せられました。
初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門
数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ