第17講 関数の再帰的呼び出しによる3次・4次魔方陣ソフトの改良
第4話 偶数版枠番号付けの解説その2
最後の謎を解説しましょう。
            else if(i<(m+1)*n){
              x[i]=(i-2*n)%(n-2);
              y[i]=(i-2*n)/(n-2);

              if(x[i]>=y[i])x[i]++;
              if(x[i]>=n-y[i]-1)x[i]++;
            
}

               if(x[i]>=y[i])x[i]++;
               if(x[i]>=n-y[i]-1)x[i]++;

の部分は、トレースしてみれば思惑通り枠番号付けに成功していることは分かりますが、
残された大きな謎です。
x[i]>=y[i]x[i]>=n-y[i]-1を解明できない限りこの謎は解くことはできません。
x[i]>=y[i]の謎を解明するために、まずx[i]=y[i]の意味を考えましょう。

10 11
12 13
14 15

 

赤の番号はx[i]、濃紺の番号はy[i]、ピンクの番号は枠番号gに対応)

左図を見て頂ければ分かりますが、

10 11
12 13
14 15

 

x[i]=y[i]の意味は、対角線です。 
(0,0)(1,1)(2,2)(3,3)ですよね。

数学のy=xを思い出して下さい。
45度上向きの直線でした。
数学ではy軸は上向きですが、
ここではy軸は下向きになっていますので、
45度下向きの直線になるのです。


ですからとx[i]>=y[i]


10 11
12 13
14 15

 
黄色部分の領域を指しています。
つまり、

10 11
12 13
14 15

 

直線x[i]=y[i]に掛かるかまたいでいるときは、
x[i]++;の操作をしなさい、
言い換えるとx[i]を1つ左にずらしなさい、
という命令なのです。









10 11
12 13
14 15

 
左のセルが該当セルです。
それで1つずつずれて

10 11
12 13
14 15

 

  












となります。

次にx[i]>=n-y[i]-1を解明しましょう。
先程と同じようにx[i]=n-y[i]-1の意味を先に考えましょう。

10 11
12 13
14 15

 

(0,3)(1,2)(2,1)(3,0)ですから、
x[i]=n-y[i]-1の意味は、逆対角線です。 

したがって、x[i]>=n-y[i]-1

10 11
12 13
14 15

 

黄色部分です。つまり、

10 11
12 13
14 15

 














のラインをまたぐときには、x[i]++;を実行せよということになります。

10 11
12 13
14 15

 

でいえば

11

のみが該当します。
したがって、

  

10 11
12 13
14 15 00

 

となります。  
















第11講第6話へ
 第12講第1話へ  第17講第3話へ 第17講第5話へ



VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座