第14講 4次及び6次魔方陣の作成
第5話 対角線の交換プログラムの解説その2
Ⅱ 対角線の交換による魔方陣の完成

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

解答コード主要部分再掲
  public static void g(int a[][]){
    int i,w;
    for(i=0;i<2;i++){
      w=a[i][i];
      a[i][i]=a[3-i][3-i];
      a[3-i][3-i]=w;
    }
    for(i=0;i<2;i++){
      w=a[i][3-i];
      a[i][3-i]=a[3-i][i];
      a[3-i][i]=w;
    }
  }
解説
本話は
    for(i=0;i<2;i++){
      w=a[i][3-i];
      a[i][3-i]=a[3-i][i];
      a[3-i][i]=w;
    }
の部分のトレースです。

i=0のとき、
      w=a[i][3-i];

      w=a[0][3-0]=a[0][3];
ですから、座標()の値4が、

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

一時収納のボックスwに代入されます。
入門
次の行
      a[i][3-i]=a[3-i][i];

      a[0][3-0]=a[3-0][0];
すなわち
      a[0][3]=a[3][0];

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

座標()の値13が座標()に代入されて、

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

となります。
3行目
      a[3-i][i]=w;

      a[3-0][0]=a[3][0]=w;
で一時収納ボックスwの値java4が座標()に代入され、

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

座標()と座標()の交換ができました。

i=1のとき、
      w=a[i][3-i];

      w=a[1][3-1]=a[1][2];
ですから、座標()の値

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

7が1次収納ボックスwに
初心者
に納められます。
2行目
      a[i][3-i]=a[3-i][i];

      a[1][3-1]=a[3-1][1];
すなわち
      a[1][2]=a[2][1];
で座標(

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

の値10が座標()に代入されて

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

となります。
最後の行
      a[3-i][i]=w;

      a[3-1][1]=a[2][1]=w;
ですから、1次収納ボックスwの値基礎7が座標()が代入され、

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

座標()と座標()の交換が成功できて、晴れて4次魔方陣の完成です。


さて、次は

Ⅲ 6次自然配列の生成

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

への挑戦です。






第4話へ 第6話へ

戻る

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

初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第1部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第2部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第3部